条件变量实现生产者消费者模型

网友投稿 704 2022-10-21

条件变量实现生产者消费者模型

条件变量实现生产者消费者模型

同条件变量和互斥锁实现生产者和消费者模型

#include#include#include#include//利用链表模拟共享资源struct msg{ struct msg *next; int num;};struct msg *head=NULL;struct msg *mp=NULL;//静态初始化//互斥锁的初始化pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//条件变量的初始化pthread_cond_t has_product=PTHREAD_COND_INITIALIZER;//生产者线程函数void*producter(void*arg){ while(1) { //生产产品 mp=malloc(sizeof(struct msg)); mp->num=rand()%400+1; printf("---producter---%d\n",mp->num); //加锁,修改共享数据,解锁 pthread_mutex_lock(&mutex); mp->next=head; head=mp; pthread_mutex_unlock(&mutex); //释放信号,唤醒在条件量上的线程 pthread_cond_signal(&has_product); //增加时长,使得cpu易主 sleep(rand()%4); } return NULL;}//消费者线程函数void*consumer(void*arg){ while(1) { pthread_mutex_lock(&mutex); //头指针若不为空,pthread_cond_wait函数没有执行的必要,我锁住去消费就好 //可能同时有多个线程条件变量被唤醒,但是只有一个线程的互斥锁锁住 while(head==NULL) { pthread_cond_wait(&has_product,&mutex); } //消费掉产品 mp=head; head=mp->next; pthread_mutex_unlock(&mutex); printf("-------consumer--%d\n",mp->num); free(mp); mp=NULL; sleep(rand()%3); } return NULL;}int main(){ srand(time(NULL)); //定义生产者,消费者线程ID pthread_t p_tid,c_tid; //创建生产者线程 pthread_create(&p_tid,NULL,producter,NULL); //创建消费者线程 pthread_create(&c_tid,NULL,consumer,NULL); //回收线程 pthread_join(p_tid,NULL); pthread_join(c_tid,NULL); return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于React的炫酷的滚动抽奖程序
下一篇:一个PHP序列化程序,可生成PHP代码以获得最佳性能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~