怎么样用C++实现生产者消费者的模拟
// producer_consumer.cpp//////////////////////////////////////////////////////////////////////// 有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,// 在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓// 冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消// 费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。//////////////////////////////////////////////////////////////////////#include \u0026lt;pthread.h\u0026gt;#include \u0026lt;stdio.h\u0026gt;#include \u0026lt;stdlib.h\u0026gt;#include \u0026lt;unistd.h\u0026gt;const int BUFFER_LENGTH = 100;int buffer;int front = 0, rear = -1; // 缓冲区的前端和尾端int size = 0;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;void *producer(void *arg);void *consumer(void *arg);int main(int argc, char **argv){ pthread_t producer_id; pthread_t consumer_id; pthread_create(\u0026amp;producer_id, NULL, producer, NULL); pthread_create(\u0026amp;consumer_id, NULL, consumer, NULL); \t//主线程运行结束,子线程也就运行结束了\t//http://bbs.chinaunix.net/thread-1286290-1-1.html sleep(1); return 0;}void *producer(void *arg){ //pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态,一旦线程处于分离状态, //该线程终止时底 层资源立即被回收;否则终止子线程的状态会一直保存(占用系统资源)直到主线程调用pthread_join(threadid,NULL)获取线程的退 出状态。 //通常是主线程使用pthread_create()创建子线程以后,一般可以调用pthread_detach(threadid)分离刚刚创建的子线程, //这里的threadid是指子线程的threadid;如此以来,该子线程止时底层资源立即被回收; //被创建的子线程也可以自己分离自己,子线程调用pthread_detach(pthread_self())就是分离自己, //因为pthread_self()这个函数返回的就是自己本身的线程ID; pthread_detach(pthread_self()); while (true) { pthread_mutex_lock(\u0026amp;mutex); while (size == BUFFER_LENGTH) // 如果缓冲区已满,等待; 否则,添加新产品 { printf("buffer is full. producer is waiting...\"); pthread_cond_wait(\u0026amp;cond, \u0026amp;mutex); } // 往尾端添加一个产品 rear = (rear + 1) % BUFFER_LENGTH; buffer = rand() % BUFFER_LENGTH; printf("producer produces the item %d: %d\", rear, buffer); ++size; if (size == 1) // 如果当前size=1, 说明以前size=0, 消费者在等待,则给消费者发信号 { pthread_cond_signal(\u0026amp;cond); } pthread_mutex_unlock(\u0026amp;mutex); }}void *consumer(void *arg){ pthread_detach(pthread_self()); while (true) { pthread_mutex_lock(\u0026amp;mutex); while(size == 0) // 如果缓冲区已空,等待; 否则,消费产品 { printf("buffer is empty. consumer is waiting...\"); pthread_cond_wait(\u0026amp;cond, \u0026amp;mutex); } // 从前端消费一个产品 printf("consumer consumes an item%d: %d\", front, buffer); front = (front + 1) % BUFFER_LENGTH; --size; if (size == BUFFER_LENGTH-1) // 如果当前size=BUFFER_LENGTH-1,说明以前生产者在等待,则给生产者发信号 { pthread_cond_signal(\u0026amp;cond); } pthread_mutex_unlock(\u0026amp;mutex); }}
推荐阅读
- 北京22家市属医院均开展安检基本实现重点区域安检措施全覆盖
- 长江流域渔民退捕“上岸”实现扩产新致富
- 实现“甜蜜计划”,这对中哈跨国夫妻好甜
- 北京地铁11号线西段三座车站提前实现主体结构封顶
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 青年|一汽奔腾T77怎么样?车主吐槽:后排座椅太短,和坐小板凳似的
- 非计算机专业想要利用课余时间深入自学C++,想要找到比较体面的工作大概需要啥水平
- 电商网站支付流程的流失率是怎么样的从用户点击充值/支付按钮,到支付完成,其中每一步的流失比率都是咋样的
- 作为一个服装供应商,怎么样与淘宝卖家沟通才能卖出自己的产品或者拿到订单
- 在丁丁租房工作的感受是怎么样的
