#include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> #include<time.h> #define apple_not_enough 3 int not_anymore = 0; struct apple_struct { int num; pthread_mutex_t lock; // pthread_cond_t fantastic; pthread_cond_t enough; }; struct apple_struct apple; void *consume(void *arg) { int i; i = 10; sleep(1); pthread_mutex_lock(&apple.lock); while(i!=0) { while(apple.num==0) { printf("apple not enough, want more\n"); pthread_cond_wait(&apple.enough,&apple.lock); //等待时候阻塞此进程,所以永远不会出现苹果个数小于0,发送信号给等待的第一个线程,这里只有两个 } apple.num--; printf("consume 1 apple,now left %d\n",apple.num); if(apple.num<0) break; i--; // pthread_cond_signal(&apple.fantastic); pthread_mutex_unlock(&apple.lock); sleep(1); //消耗苹果速率快于生产 pthread_mutex_lock(&apple.lock); } if(i!=0) printf("Fuck!\n"); else printf("I'm full\n"); not_anymore = 1; pthread_mutex_unlock(&apple.lock); return NULL; } void *produce(void *arg) { pthread_mutex_lock(&apple.lock); while(!not_anymore) { apple.num++; printf("produce 1 apple more,now have %d\n",apple.num); pthread_cond_signal(&apple.enough); pthread_mutex_unlock(&apple.lock); sleep(3); //生产苹果速率慢于消耗 pthread_mutex_lock(&apple.lock); } printf("OK! My job is done! dala dala...\n"); pthread_mutex_unlock(&apple.lock); return NULL; } int main(void) { pthread_t con,pro; int ret; void *val; apple.num = 3; pthread_mutex_init(&apple.lock,NULL); pthread_cond_init(&apple.enough,NULL); ret = pthread_create(&con,NULL,consume,NULL); if(ret!=0) { printf("create consume fail\n"); return -1; } ret = pthread_create(&pro,NULL,produce,NULL); if(ret!=0) { printf("create produce fail\n"); return -1; } ret = pthread_join(con,&val); if(ret!=0) { printf("can not wait to consume finish\n"); return -1; } ret = pthread_join(pro,&val); if(ret!=0) { printf("can not wait to produce finish\n"); return -1; } return 0; } 运行结果: |
|
来自: champion_xu > 《my yc》