生产者消费者问题代码示例
2017-07-14 20:48
351 查看
生产者消费者问题是一个经典的并发实例,因为项目需要代码优化实现程序并行,因此直接学习这一部分知识拿来用作代码的优化,也是边学习边理解。程序菜鸟一只,只希望尽快入门,早点得道。
这段代码是从别人处偷来的,但是别人的源代码无法执行,我算是改正了之后的,经过自己亲自实验是保证可以运行的。
该程序编译的时候注意在编译命令后加 -lpthread,
运行之后,结果如下:
因为生产和消费均为无限循环,可以执行下去查看结果。
这段代码是从别人处偷来的,但是别人的源代码无法执行,我算是改正了之后的,经过自己亲自实验是保证可以运行的。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define M 32 /*缓冲数目*/ #define P(x) sem_wait(&x)//使信号量-1 #define V(x) sem_post(&x)//使信号量+1 int in = 0; /*生产者放置产品的位置*/ int out = 0; /*消费者取产品的位置*/ int buff[M] = {0}; /*缓冲初始化为0, 开始时没有产品*/ sem_t empty_sem; /*同步信号量,当满了时阻止生产者放产品*/ sem_t full_sem; /*同步信号量,当没产品时阻止消费者消费*/ pthread_mutex_t mutex; /*互斥信号量, 一次只有一个线程访问缓冲*/ /* *output the buffer */ void print() { int i; for(i = 0; i < M; i++) printf("%d ", buff[i]); printf("\n"); } /* *producer */ void *producer(void *arg) { for(;;) { sleep(1); P(empty_sem); pthread_mutex_lock(&mutex); in = in % M; printf("(+)produce a product. buffer:"); buff[in] = 1; print(); ++in; pthread_mutex_unlock(&mutex); V(full_sem); } } /* *consumer */ void *consumer(void *arg) { for(;;) { sleep(2); P(full_sem); pthread_mutex_lock(&mutex); out = out % M; printf("(-)consume a product. buffer:"); buff[out] = 0; print(); ++out; pthread_mutex_unlock(&mutex); V(empty_sem); } } void sem_mutex_init() { /* *semaphore initialize */ int init1 = sem_init(&empty_sem, 0, M);//sem_init()函数用作进行信号量的初始化,第三个参数分别代表初始化之后的值,M就代表空余的位置,可以 //使生产者生产这么多产品,每次执行P操作,其值减一直到为0,只要大于零就可以继续执行该线程。 int init2 = sem_init(&full_sem, 0, 0);//full_sem信号被初始化为0,代表此时仓库中的产品个数。 if( (init1 != 0) && (init2 != 0)) { printf("sem init failed \n"); exit(1); } /* *mutex initialize */ int init3 = pthread_mutex_init(&mutex, NULL); if(init3 != 0) { printf("mutex init failed \n"); exit(1); } } int main() { pthread_t id1; pthread_t id2; int i; int ret; sem_mutex_init(); /*create the producer thread*/ ret = pthread_create(&id1, NULL, producer, NULL); if(ret != 0) { printf("producer creation failed \n"); exit(1); } /*create the consumer thread*/ ret = pthread_create(&id2, NULL, consumer, NULL); if(ret != 0) { printf("consumer creation failed \n"); exit(1); } pthread_join(id1,NULL); pthread_join(id2,NULL); exit(0); }
该程序编译的时候注意在编译命令后加 -lpthread,
运行之后,结果如下:
(+)produce a product. buffer:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (+)produce a product. buffer:0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (-)consume a product. buffer:0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
因为生产和消费均为无限循环,可以执行下去查看结果。
相关文章推荐
- posix 匿名信号量与互斥锁 示例生产者--消费者问题
- 22.用JAVA中的多线程示例生产者和消费者问题
- 用多线程实现“生产者-消费者问题”(代码+实验报告)
- 详解生产者消费者问题 lock newCondition的方法 附加代码 和遇到的问题详解
- java实现 生产者和消费者问题 多线程同步示例
- posix 信号量与互斥锁 示例生产者--消费者问题 .
- Linux组件封装(五)一个生产者消费者问题示例
- Java 多线程 生产者与消费者问题测试代码
- posix 条件变量与互斥锁 示例生产者--消费者问题
- 多线程-生产者消费者问题代码1
- 线程之消费者和生产者问题代码
- posix 条件变量与互斥锁 示例生产者--消费者问题 .
- 多生产者多消费者简单代码示例
- linux下生产者与消费者问题代码,以及编译c代码时error:undefined reference to sem_wait 解决方法之一
- 用 wait-notify 写一段代码来解决生产者-消费者问题?
- 面试题:用 wait-notify 写一段代码来解决生产者-消费者问题
- 多线程_生产者消费者问题代码1
- Java线程同步:生产者-消费者 模型(代码示例)
- linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题
- java生产者消费者问题代码分析