上一篇中生产者消费者的例子是基于链表的,它的空间是可以动态分配的。现在,这个程序是基于固定大小的循环队列重写的。这次不是用mutex而是用semaphore来实现线程间同步!上一篇链接:https://segmentfault.com/a/11...生产者还是生产一个结构串在链表的表头,消费者从表头拿结构,但是生产者不生产或者已经生产完毕,消费者需要挂机等待。1#include2#include3#include4#include56#defineNUM57intqueue[NUM];8sem_tblank_number,product_number;910void*producer(void*arg)11{12intp=0;13while(1){14sem_wait(&blank_number);//wait可以得到signal,这样init初始化中的信号量值为-1,如果减为0则挂起等待,继续访问成功后进行后续操作15queue[p]=rand()%1000+1;16printf("生产%d\n",queue[p]);17sem_post(&product_number);//可以释放上面操作占用的资源并唤醒下一个等待执行的线程,并使信号量的>值+118p=(p+1)%NUM;//循环队列+119睡眠(兰德()%5);20}21}2223void*consumer(void*arg)24{25intc=0;26while(1){27sem_wait(&product_number);//此时的产品线程的信号量值从init中的0变成了1,所以有1个资源可以等待,不会阻塞!使用后,此处变回0,但可以进行后续操作。28//因为还有信号等待访问,访问成功再继续后续操作29printf("Consume%d\n",queue[c]);30queue[c]=0;//usedqueuevalue设置为0,方便观察进程是否同步(即consumer是否取走已经取走的queuevalue:)31sem_post(&blank_number);//释放一个信号(这里的释放是waitOccupiedthread信号的后续操作)给blank_number,唤醒下一个阻塞或等待的进程,semaphore+132c=(c+1)%NUM;33睡眠(兰德()%5);34}35}3637intmain(intargc,char*argv[])38{39pthread_tpid,cid;4041sem_init(&blank_number,0,NUM);42sem_init(&product_number,0,0);43pthread_create(&pid,NULL,生产者,NULL);44pthread_create(&cid,NULL,消费者,NULL);45pthread_join(pid,NULL);46pthread_join(cid,NULL);47sem_destroy(&blank_number);48sem_destroy(&product_number);49返回0;接下来执行:gccsemaphore.c-osemaphore-lpthread./semaphore执行结果如下(先进先出模式):