生产者与消费者模型代码及具体事例
2018-02-06 11:24
253 查看
该模型利用信号量来完成线程间的同步操作(按照一定顺序来决定谁先进缓冲区,谁后进缓冲区);以下为具体事例,去除两线程工作函数内的while语句(对缓冲区的具体操作)后,剩余即为该模型的整体框架结构:一个消费者线程,一个生产者线程,一个缓冲区(缓冲区内有控制生产者和消费者进出的信号量 + 存储的数据)。
#include <stdio.h> #include <semaphore.h> #include <pthread.h> #include <string.h> #include <time.h> struct data { sem_t empty;//生产者信号量,缓冲区为空才生产产品 sem_t full; //消费者信号量,缓冲区满了才消费产品 char buf[10];//缓冲区 }; struct data msg;//定义全局变量才能使所有线程都能使用缓冲区 //生产者线程工作函数 void* Produce(void*a) { char* buf[] = {"adc", "中单", "上单", "打野", "辅助"}; while(1) { sem_wait(&msg.empty);//P操作-1:刚开始msg.empty=1,缓冲区为空才生产产品 //empty-1 = 0;第二次循环时,也就生产者不能进入 strcpy(msg.buf, buf[rand()%5]);//随机取下标为0-4的数组元素 printf("敌方%s已上线\n", msg.buf); int time = rand() % 100 + 1; usleep(time*10000); sem_post(&msg.full);//V操作+1:生产结束通知消费者可以消费了 } } //消费者线程的工作函数 void* Consume(void*a) { char buf[10]; while(1) { sem_wait(&msg.full);//消费者信号量一开始为0,需等待生产者生产结束后通知(v操作+1),被通知(full=1)后,进行P操作(-1)不让其他线程进入 strcpy(buf, msg.buf);//获取缓冲区msg.buf的内容 printf("击杀敌方%s\n", buf); int time = rand() % 100 + 1; usleep(time*10000); sem_post(&msg.empty);//V操作+1,消费过后通知生产者继续生产empty+1 = 1,生产者可继续生产 } } int main() { srand ((unsigned int)time(NULL)); //初始化生产者和消费者的信号量 sem_init(&msg.empty, 0, 1);//生产者一开始就可以生产产品 sem_init(&msg.full, 0, 0); //消费者,一开始无物可消费 //生产者线程id pthread_t produceID; //消费者线程id pthread_t consumeID; //创建生产者线程 pthread_create(&produceID, NULL, Produce, NULL); //创建消费者线程 pthread_create(&consumeID, NULL, Consume, NULL); //等待两个线程结束回收资源 pthread_join(produceID, NULL); pthread_join(consumeID, NULL); //销毁信号量 sem_destroy(&msg.empty); sem_destroy(&msg.full); return 0; }
相关文章推荐
- 第十三篇:生产者—消费者模型(含代码)
- Java并发编程之十六:生产者—消费者模型(含代码)
- 生产者——消费者模型的java代码实现
- 【Java并发编程】之十三:生产者—消费者模型(含代码)(r)
- Java线程同步:生产者-消费者 模型(代码示例)
- 【Java并发编程】:生产者—消费者模型(含代码)
- 【Java并发编程】之十三:生产者—消费者模型(含代码)
- 转: 【Java并发编程】之十三:生产者—消费者模型(含代码)
- 【Java并发编程】之十三:生产者—消费者模型(含代码)
- java挑战高并发 之(11):生产者—消费者模型(含代码)
- Java线程同步:生产者-消费者 模型(代码示例)
- 消费者&生产者模型的python代码
- Java并发编程】之十三:生产者—消费者模型(含代码)
- Java并发编程】之十三:生产者—消费者模型(含代码)
- Java线程同步:生产者-消费者 模型(代码示例)
- 用64行代码实现生产者与消费者模型
- 【Java并发编程】之十三:生产者—消费者模型(含代码)
- 多线程生产者与消费者问题代码模型
- 使用swoole实现生产者消费者模型(2)
- 利用两个线程实现生产者消费者模型