LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 862|回复: 2

怎样建立信号量与资源之间的联系

[复制链接]
发表于 2006-4-2 11:41:35 | 显示全部楼层 |阅读模式
很想编写一个银行家算法的程序,但就是不知道如何建立信号量与资源之间的联系,不知大家有何高招,请指教
发表于 2006-4-3 09:13:14 | 显示全部楼层
联系?靠自觉啦
访问资源的时候先自己取得信号量
你可以自己封装一下
回复 支持 反对

使用道具 举报

发表于 2006-4-5 04:40:30 | 显示全部楼层
这个问题好好复杂呀,对啊,如何建立联系?
简而言之吧,把访问共享资源的部分称为临界区,在进入临界区之前先down信号量(如果信号量已经是0了就睡觉去),出临界区之后up信号量(内核会把在该信号量上睡觉的某个进程唤醒),
代码像下面这样,好像有点复杂哦,System V的信号量是这样子的,但是方便啊,可以使用多个信号量的信号量集合。
为什么叫p,v,呵呵就是荷兰语的down和up。Dijkstra这么用。
要想了解更多就搞本书来看看好了,一时半会说不清。


  1. struct sembuf postop[1], waitop[1];
  2. /* Create a system V semaphore set and initialize it */
  3. void
  4. crsemset (int fd)
  5. {
  6.     int oflags;
  7.     key_t key = ftok (LOCKPATH, fd);
  8.     union semun arg;
  9.     int i;

  10.     oflags = IPC_CREAT | IPC_EXCL | SEMMODE;

  11.     if ((semid = semget (key, 1, oflags)) >= 0) /* 1 semaphore semset */
  12.     {
  13.         arg.val = 0;
  14.         semctl (semid, 0, SETVAL, arg);
  15.         arg.val = 1;
  16.         semctl (semid, 1, SETVAL, arg);
  17.     }
  18.     else if (errno != EEXIST)
  19.     {
  20.         perror ("semget failed");
  21.         exit (1);
  22.     }

  23.     for (i = 0; i < 1; i++)
  24.     {
  25.         postop[i].sem_num = i;
  26.         postop[i].sem_op = 1;
  27.         postop[i].sem_flg = SEM_UNDO;
  28.         waitop[i].sem_num = i;
  29.         waitop[i].sem_op = -1;
  30.         waitop[i].sem_flg = SEM_UNDO;
  31.     }
  32. }

  33. void
  34. p (int i)
  35. {
  36.     semop (semid, &(waitop[i]), 1); /* Down by 1 */
  37. }

  38. void
  39. v (int i)
  40. {
  41.     semop (semid, &(postop[i]), 1); /* Up by 1 */
  42. }

  43. void
  44. f (void)
  45. {
  46.     p (0);
  47.     /* 访问你的资源 */
  48.     v (0);
  49. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表