生产者消费者——一对一
来源:互联网 发布:五子棋人工智能算法 编辑:程序博客网 时间:2024/05/16 10:47
同步中有一个“生产者消费者”的经典问题,也叫它“有界缓冲区”
生产者生产数据,消费者取数据是消费(取出)数据。”数据多,空间少”才能造成生产者消费者问题
(数据)空的时候不能消费,(空间)满的时候不能生产.
这一篇实现一个生产者对应一个消费者,即一对一的情况
#include<stdio.h>#include<unistd.h>#include<pthread.h>#define MAX_PRODUCER_SIZE 1#define MAX_CONSUMER_SIZE 1#define MAX_COUNT 20#define MAX_BUFFER_SIZE 8struct pcst{ pthread_mutex_t mutex; pthread_cond_t not_full; pthread_cond_t not_empty; int buffer[MAX_BUFFER_SIZE]; int write_pos; int read_pos; int nvalue;}shared = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER};//注意not_full/not_empty是一个结构体,系统中它的初始化是PTHREAD_MUTEX_INITIALIZER,这个东西是以宏的形式定义的,所以在这里就对not_full/not_empty进行初始化比较方便,不然后面对它赋值时,相当于给一个结构体赋值,编译会报错。类似结尾给出的一样void init_pcst(){ shared.write_pos = 0; shared.read_pos = 0; shared.nvalue = 1;}void put_value(struct pcst *pc, int value){ pthread_mutex_lock(&pc->mutex); if((pc->write_pos+1)%MAX_BUFFER_SIZE == pc->read_pos) pthread_cond_wait(&pc->not_full, &pc->mutex); pc->buffer[pc->write_pos++] = value; pc->write_pos %= MAX_BUFFER_SIZE; pthread_cond_signal(&pc->not_empty); pthread_mutex_unlock(&pc->mutex);}int get_value(struct pcst *pc){ pthread_mutex_lock(&pc->mutex); if(pc->read_pos == pc->write_pos) pthread_cond_wait(&pc->not_empty, &pc->mutex); int data = pc->buffer[pc->read_pos++]; pc->read_pos %= MAX_BUFFER_SIZE; pthread_cond_signal(&pc->not_full); pthread_mutex_unlock(&pc->mutex); return data;}void* producer(void *arg){ for(int i=1; i<=MAX_COUNT; ++i) { put_value(&shared, shared.nvalue); shared.nvalue++; }}void* consumer(void *arg){ while(1) { int value = get_value(&shared); printf("%d\n", value); if(value >= MAX_COUNT) break; // sleep(1); }}int main(int argc, char const* argv[]){ // shared.write_pos = shared.read_pos = 0; //shared.nvalue = 1; init_pcst(); pthread_t p_id[MAX_PRODUCER_SIZE]; pthread_t c_id[MAX_CONSUMER_SIZE]; for(int i=0; i<MAX_PRODUCER_SIZE; ++i) { pthread_create(&p_id[i], NULL, producer, NULL); } for(int i=0; i<MAX_CONSUMER_SIZE; ++i) { pthread_create(&c_id[i], NULL, consumer, NULL); } for(int i=0; i<MAX_PRODUCER_SIZE; ++i) { pthread_join(p_id[i], NULL); } for(int i=0; i<MAX_CONSUMER_SIZE; ++i) { pthread_join(c_id[i], NULL); } return 0;}
结果
系统对PTHREAD_COND_INITIALIZER的定义等
对结构体赋值的结果
1 0
- 生产者消费者——一对一
- 生产者与消费者--一对一
- java 线程-一对一生产者消费者
- 生产者—消费者模式
- 生产者—消费者模型
- 生产者—消费者模型
- 生产者—消费者模型
- java一对一生产者消费者多线程练习
- 生产者——消费者问题
- 多线程——生产者消费者
- 生产者——消费者模式
- 线程——消费者生产者
- 生产者—消费者(MUTEX版)
- 生产者与消费者一对一,一对多,多对多
- java多线程——生产者、消费者
- 生产者消费者问题——Java方案
- java多线程应用——生产者消费者
- 多线程——生产者/消费者问题
- java集合框架
- HDU 2389 Rain on your Parade(Hopcroft-Carp算法模板)
- 每个人都需要的中文排版指南
- Linux命令--touch
- Vue.js 相关问题
- 生产者消费者——一对一
- Mac Pro® Rackmount Kit
- swift项目桥接通过cocoapods pod下来的第三方oc文件引入不成功
- 深入浅出ES6(六):解构(Destructuring)
- 链表中环的入口节点
- Android开发:最全面、最易懂的Webview详解
- Python进阶(十)-Python 编程规范
- 3.15之后,你觉得你的个人数据安全情况如何?
- jQuery Easing 使用方法及其图解