Linux系统编程——生产者与消费者(二)
来源:互联网 发布:网络公开课 编辑:程序博客网 时间:2024/05/22 12:50
上篇博客是用信号量实现了这个问题,这里我用条件变量来实现这个问题:
/*借助条件变量模拟 生产者-消费者 问题*/#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <stdio.h>/*链表作为公享数据,需被互斥量保护*/struct msg { struct msg *next; int num;};struct msg *head;struct msg *mp;/* 静态初始化 一个条件变量 和 一个互斥量*/pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void *consumer(void *p){ for (;;) { pthread_mutex_lock(&lock); while (head == NULL) { //头指针为空,说明没有节点 可以为if吗 pthread_cond_wait(&has_product, &lock); } mp = head; head = mp->next; //模拟消费掉一个产品 pthread_mutex_unlock(&lock); printf("-Consume ---%d\n", mp->num); free(mp); mp = NULL; sleep(rand() % 5); }}void *producer(void *p){ for (;;) { mp = malloc(sizeof(struct msg)); mp->num = rand() % 1000 + 1; //模拟生产一个产品 printf("-Produce ---%d\n", mp->num); pthread_mutex_lock(&lock); mp->next = head; head = mp; pthread_mutex_unlock(&lock); pthread_cond_signal(&has_product); //将等待在该条件变量上的一个线程唤醒 sleep(rand() % 5); }}int main(int argc, char *argv[]){ pthread_t pid, cid; srand(time(NULL)); pthread_create(&pid, NULL, producer, NULL); pthread_create(&cid, NULL, consumer, NULL); pthread_join(pid, NULL); pthread_join(cid, NULL); return 0;}
0 0
- Linux系统编程——生产者与消费者(二)
- Linux系统编程——生产者与消费者问题
- linux 多线程编程之——消费者与生产者
- linux系统编程中的信号量--模拟生产者与消费者
- Linux 系统应用编程——多线程经典问题(生产者-消费者)
- Linux 系统应用编程——多线程经典问题(生产者-消费者)
- <网络编程培训之二> 编程实现生产者与消费者问题(linux下C实现)
- C++编程实现生产者/消费者模型(linux系统编程)
- 生产者与消费者(二)
- Kafka消费者生产者编程模型(二)
- Linux--生产者与消费者
- Linux--生产者与消费者
- C#生产者与消费者问题(二)
- 同步规范------生产者与消费者(二)
- 生产者与消费者模型(二)
- C#多线程(二)——生产者和消费者实例
- javaSE基础编程——多线程(生产者和消费者)
- 【Java并发编程】:生产者—消费者模型(含代码)
- 嵌入式编译器
- Java 多态
- 进程与线程
- [TensorFlow]修炼tfboy入门学习笔记-1
- 【CQOI2017】 bzoj4814 小Q的草稿
- Linux系统编程——生产者与消费者(二)
- C语言实现简单24点游戏
- HTML5第五课时,雪碧图的应用!!
- 将Mininet中host与外部虚拟机连接
- nyoj241 最长单调递增子序列二
- 动态规划练习一 09:移动路线
- Mybatis多表联结查询底层配置
- HTML基本知识点——超链接
- 数据库学习