博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产者消费者
阅读量:4596 次
发布时间:2019-06-09

本文共 2777 字,大约阅读时间需要 9 分钟。

1 #include 
2 #include
3 #include
4 #include
5 #define _GNU_SOURCE 6 #include
7 enum bool { FALSE = 0,TRUE =1}; 8 enum bool slave_can_print = TRUE; 9 enum bool main_can_print = FALSE; 10 11 #define NUMBER_PRODUCER 5 12 #define NUMBER_CONSUMER 3 13 const int max_capacity = 10; 14 int capacity = 10 ; 15 16 17 pthread_cond_t cond_prod = PTHREAD_COND_INITIALIZER; 18 pthread_cond_t cond_cons = PTHREAD_COND_INITIALIZER; 19 pthread_mutex_t mutex_pool = PTHREAD_MUTEX_INITIALIZER; 20 21 22 void* thread_prod(void* arg); 23 void* thread_cons(void* arg); 24 int get_interval(void); 25 26 int main(int argc, char* argv[]) 27 { 28 int ret; 29 int i; 30 pthread_t prod[NUMBER_PRODUCER]; 31 pthread_t cons[NUMBER_CONSUMER]; 32 33 for( i = 0; i < NUMBER_PRODUCER; i++) 34 { 35 ret = pthread_create(&prod[i],NULL,thread_prod,(void*)i); 36 if( ret != 0 ) 37 { 38 strerror(ret); 39 } 40 } 41 for( i = 0; i < NUMBER_CONSUMER; i++) 42 { 43 ret = pthread_create(&cons[i],NULL,thread_cons,(void*)i); 44 if( ret != 0 ) 45 { 46 strerror(ret); 47 } 48 } 49 50 pthread_exit(NULL); 51 52 } 53 void* thread_prod(void* arg) 54 { 55 int id = (int)arg; 56 int interval; 57 while(1) 58 { 59 pthread_mutex_lock(&mutex_pool); 60 if(capacity < max_capacity) 61 { 62 capacity ++; 63 printf("producer %d capacity is %d\n",id,capacity); 64 pthread_cond_signal(&cond_cons); 65 interval = get_interval(); 66 sleep(interval); 67 } 68 else 69 { 70 pthread_cond_wait(&cond_prod,&mutex_pool); 71 } 72 pthread_mutex_unlock(&mutex_pool); 73 } 74 return NULL; 75 } 76 void* thread_cons(void* arg) 77 { 78 int id = (int)arg; 79 int interval; 80 while(1) 81 { 82 pthread_mutex_lock(&mutex_pool); 83 if(capacity > 0 ) 84 { 85 capacity --; 86 printf("consumer %d capacity is %d\n",id,capacity); 87 pthread_cond_signal(&cond_prod); 88 interval = get_interval(); 89 //pthread_yield(); 90 sleep(interval); 91 } 92 else 93 { 94 pthread_cond_wait(&cond_cons,&mutex_pool); 95 } 96 pthread_mutex_unlock(&mutex_pool); 97 } 98 99 return NULL;100 }101 102 int get_interval(void)103 {104 int val;105 srand(time(NULL));106 val = rand() % 3;107 return val;108 }

 

转载于:https://www.cnblogs.com/xiaoyuer403/p/7428719.html

你可能感兴趣的文章
用python代码模拟键盘输入
查看>>
Python 字符编码与转码
查看>>
Docker Flie
查看>>
springMVC参数绑定JSON类型的数据
查看>>
Python flask-sqlalchemy初级解析
查看>>
[Swift]iOS开发之初识CoreData
查看>>
JS封装addClass、removeClass
查看>>
openlayers编辑区域
查看>>
百度地图api接口
查看>>
kendo ui - DropDownList 下拉列表系列
查看>>
Mask R-CNN详解和安装
查看>>
poj2017
查看>>
【程序员人生】优秀程序员的法则
查看>>
cocos2d下,优秀骨骼spine的换装思路
查看>>
Windows 10 MBR转GPT
查看>>
iuplua test failure
查看>>
6 tr
查看>>
同开三本DJANGO,需要提升一下本职工作的能力啦
查看>>
这样就算会了PHP么?-2
查看>>
线段树 (区间查询最大 区间求和 区间加)带lazy
查看>>