信号量P/V操作

//深入理解计算机系统

1,信号量s是具有非负整数值的全局变量,只能由两种特殊的操作来处理,这两种操作称为P和V:
P(s):如果s是非零的,那么P将s减1,并且立即返回。如果s为零,那么就挂起这个线程,直到s变为非零,而一个V操作会重启这个线程。在重启止呕,P操作将s减1,并将控制返回给调用者。
V(s):V操作将s加1。如果有任何线程阻塞在P操作等待s变成非零,那么V操作会重启这些线程中的一个,然后该线程将s减1,完成它的P操作。(V的定义中没有定义等待线程被重新启动的顺序。唯一的要求是V必须只能重启一个正在等待的线程。因此,当有多个线程在等待同一个信号量时,你不能预测V操作要重启哪个线程。)
The definitions of P and V ensure that a running program can never enter a state where a properly initialized semaphore has a negative value.
2,生产者-消费者问题

点击(此处)折叠或打开

  1. typedef struct sbuf_t
  2. {
  3.     int *buf;//Buffer array.
  4.     int n;//Buffer的大小,即最大slots个数。
  5.     int fornt;
  6.     int rear;
  7.     sem_t mutex;//提供互斥的buf访问。
  8.     sem_t slots;//可用的空槽位的数量。
  9.     sem_t items;//可用项目的数量。
  10. }sbuf_t;

  11. //sbuf_init函数为缓冲区分配堆存储器。
  12. void sbuf_init(sbuf_t *sp,int n)
  13. {
  14.     sp->buf=calloc(n,sizeof(int));//即sp->buf=(int *)malloc(n*sizeof(int));
  15.     sp->n=n;
  16.     sp->front=sp->rear=0;
  17.     sem_init(&sp->mutex,0,1);
  18.     sem_init(&sp->slots,0,n);
  19.     sem_init(&sp->items,0,0);

  20.     return ;
  21. }

  22. //生产者
  23. //sbuf_insert函数等待一个可用的槽位,对互斥锁加锁,添加项目,对互斥锁解锁,然后宣布一个新项目可用。
  24. //sem_wait,sem_post分别对应与P,V操作。
  25. void sbuf_insert(sbuf_t *sp,int item)
  26. {
  27.     sem_wait(&sp->slots);
  28.     sem_wait(&sp->mutex);
  29.     //以上两个wait函数不能互换,以防死锁。
  30.     sp->buf[(++sp->rear)%(sp->n)]=item;
  31.     sem_post(&sp->mutex);
  32.     sem_post(&sp->items);
  33. }

  34. //消费者
  35. int sbuf_remove(sbuf_t* sp)
  36. {
  37.     int item;
  38.     sem_wait(&sp->items);
  39.     sem_wait(&sp->mutex);
  40.     item=sp->buf[(++sp->front)%(sp->n)];
  41.     sem_post(&sp->mutex);
  42.     sem_post(&sp->slots);

  43.     return item;
  44. }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值