首页 > 代码库 > 线程的互斥锁和条件变量通信机制
线程的互斥锁和条件变量通信机制
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <pthread.h> 5 6 #define BUFFER_SIZE 2 7 struct prodcons 8 { 9 int buffer[BUFFER_SIZE]; 10 pthread_mutex_t lock; 11 int readpos,writepos; 12 pthread_cond_t notempty; 13 pthread_cond_t notfull; 14 }; 15 16 void init(struct prodcons *prod) 17 { 18 pthread_mutex_init(&prod->lock,NULL); 19 pthread_cond_init(&prod->notempty,NULL); 20 pthread_cond_init(&prod->notfull,NULL); 21 prod->readpos=0; 22 prod->writepos=0; 23 } 24 25 void put(struct prodcons *prod, int data) 26 { 27 pthread_mutex_lock(&prod->lock); 28 while((prod->writepos+1)%BUFFER_SIZE==prod->readpos) 29 { 30 printf("producer wait for not full\n"); 31 pthread_cond_wait(&prod->notfull,&prod->lock); 32 } 33 prod->buffer[prod->writepos]=data; 34 prod->writepos++; 35 if(prod->writepos>=BUFFER_SIZE) 36 prod->writepos=0; 37 pthread_cond_signal(&prod->notempty); 38 pthread_mutex_unlock(&prod->lock); 39 } 40 41 int get(struct prodcons *prod) 42 { 43 int data; 44 pthread_mutex_lock(&prod->lock); 45 while(prod->writepos==prod->readpos) 46 { 47 printf("consumer wait for not empty\n"); 48 pthread_cond_wait(&prod->notempty,&prod->lock); 49 } 50 data=http://www.mamicode.com/prod->buffer[prod->readpos]; 51 prod->readpos++; 52 if(prod->readpos>=BUFFER_SIZE) 53 prod->readpos=0; 54 pthread_cond_signal(&prod->notfull); 55 pthread_mutex_unlock(&prod->lock); 56 return data; 57 } 58 59 #define OVER (-1) 60 61 struct prodcons buffer; 62 63 void *producer(void * data) 64 { 65 int n; 66 for(n=1;n<=5;n++) 67 { 68 printf("producer sleep 1 second...\n"); 69 sleep(1); 70 printf("put the %d product\n",n); 71 put(&buffer,n); 72 } 73 for(n=6;n<=10;n++) 74 { 75 printf("producer sleep 3 second...\n"); 76 sleep(3); 77 printf("put the %d product\n",n); 78 put(&buffer,n); 79 } 80 put(&buffer,OVER); 81 printf("producer stopped\n"); 82 return NULL; 83 } 84 85 void *consumer(void *data) 86 { 87 int d=0; 88 while(1) 89 { 90 printf("consumer sleep 2 second...\n"); 91 sleep(2); 92 d=get(&buffer); 93 printf("get the %d product\n",d); 94 if(d==OVER) 95 break; 96 } 97 printf("consumer stopped\n"); 98 return NULL; 99 }100 101 int main(int argc, char *argv[])102 {103 pthread_t th_a,th_b;104 void *retval;105 init(&buffer);106 pthread_create(&th_a,NULL,producer,0);107 pthread_create(&th_b,NULL,consumer,0);108 pthread_join(th_a,&retval);109 pthread_join(th_b,&retval);110 return 0;111 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。