生产者消费者问题(基于线程和无名信号量)
2014-11-14 18:35
239 查看
//5.生产者消费者问题 #include <pthread.h> #include <semaphore.h> #include <unistd.h> #include <stdio.h> #define MAX 50 #define BUFSIZE 10 //仓库的大小 int buf[BUFSIZE]={0}; int in=0; int out=0; sem_t full,empty; void* producer(void* arg) { int i; for (i = 1;i<=MAX;++i) { /*produce*/ sem_wait(&full); buf[in++]=i; in%=BUFSIZE; printf("生产了第%d个产品\n" ,i); sem_post(&empty); } pthread_exit((void*)"thread1 exit\n"); } void* comsumer(void* arg) { int i,data_c; for (i = 1;i<= MAX; ++i) { /*comsumer*/ sem_wait(&empty); data_c=buf[out++]; out%=BUFSIZE; printf("消费了%d个产品\n" ,data_c); sem_post(&full); } pthread_exit((void*)"thread2 exit\n"); } int main(void) { void *tret; sem_init(&full,0,10); //信号量的初始值为10和仓库的大小保持一致 sem_init(&empty,0,0); pthread_t tid_producer,tid_comsumer; pthread_create(&tid_producer,NULL,producer,NULL); pthread_create(&tid_comsumer,NULL,comsumer,NULL); pthread_join(tid_producer,&tret); printf("%s\n",(char*)tret); pthread_join(tid_comsumer,&tret); printf("%s\n",(char*)tret); sem_destroy(&full); sem_destroy(&empty); return 0; } 此程序一定要注意信号量的个数一定要和仓库的存储空间大小数值上要一样大,此程序两个数都为10
相关文章推荐
- <linux线程>POSIX无名信号量的基本操作---两个线程间的通信
- 基于visual c++之windows核心编程代码分析(12)使用信号量同步线程
- 将应用程序从 OS/2 移植到 Linux 上: 第 1 部分,线程、互斥锁、信号量
- linux程序设计 线程 多线程编程 信号量
- linux下的线程间通信——信号量
- 【Linux】线程总结:线程同步 -互斥锁,条件变量,信号量实现多生产者多消费者模型
- Java线程:新特征-信号量
- linux线程数据及信号量详解
- 坦克大战(基于java线程)
- 基于Jdk1.5可中止制定线程的线程池简单扩展
- 进程与线程(7) 进程间通信之信号量 (java os)
- 多线程进阶006 之 停止基于线程服务
- Spring基于ThreadLocal的“资源-事务”线程绑定设计的缘起
- 线程、进程、daemon、GIL锁、线程锁、递归锁、信号量、计时器、事件、队列、多进程
- 线程同步3 ------ 信号量实现进程或者线程之间的同步
- 线程同步与互斥:互斥锁、读写锁、POSIX无名信号量
- Linux平台用C++实现信号量,同步线程
- linux 线程的同步 三 (内存信号量的使用)
- TCP并发服务器(六)——创建线程池,每个线程accept,accept使用互斥锁保护——基于UNP代码
- java信号量控制线程打印顺序的示例分享