|
|
发表于 2006-4-5 04:40:30
|
显示全部楼层
这个问题好好复杂呀,对啊,如何建立联系?
简而言之吧,把访问共享资源的部分称为临界区,在进入临界区之前先down信号量(如果信号量已经是0了就睡觉去),出临界区之后up信号量(内核会把在该信号量上睡觉的某个进程唤醒),
代码像下面这样,好像有点复杂哦,System V的信号量是这样子的,但是方便啊,可以使用多个信号量的信号量集合。
为什么叫p,v,呵呵就是荷兰语的down和up。Dijkstra这么用。
要想了解更多就搞本书来看看好了,一时半会说不清。
- struct sembuf postop[1], waitop[1];
- /* Create a system V semaphore set and initialize it */
- void
- crsemset (int fd)
- {
- int oflags;
- key_t key = ftok (LOCKPATH, fd);
- union semun arg;
- int i;
- oflags = IPC_CREAT | IPC_EXCL | SEMMODE;
- if ((semid = semget (key, 1, oflags)) >= 0) /* 1 semaphore semset */
- {
- arg.val = 0;
- semctl (semid, 0, SETVAL, arg);
- arg.val = 1;
- semctl (semid, 1, SETVAL, arg);
- }
- else if (errno != EEXIST)
- {
- perror ("semget failed");
- exit (1);
- }
- for (i = 0; i < 1; i++)
- {
- postop[i].sem_num = i;
- postop[i].sem_op = 1;
- postop[i].sem_flg = SEM_UNDO;
- waitop[i].sem_num = i;
- waitop[i].sem_op = -1;
- waitop[i].sem_flg = SEM_UNDO;
- }
- }
- void
- p (int i)
- {
- semop (semid, &(waitop[i]), 1); /* Down by 1 */
- }
- void
- v (int i)
- {
- semop (semid, &(postop[i]), 1); /* Up by 1 */
- }
- void
- f (void)
- {
- p (0);
- /* 访问你的资源 */
- v (0);
- }
复制代码 |
|