线程的互斥锁和条件变量通信机制
2014-06-16 09:08
211 查看
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> #define BUFFER_SIZE 2 struct prodcons { int buffer[BUFFER_SIZE]; pthread_mutex_t lock; int readpos,writepos; pthread_cond_t notempty; pthread_cond_t notfull; }; void init(struct prodcons *prod) { pthread_mutex_init(&prod->lock,NULL); pthread_cond_init(&prod->notempty,NULL); pthread_cond_init(&prod->notfull,NULL); prod->readpos=0; prod->writepos=0; } void put(struct prodcons *prod, int data) { pthread_mutex_lock(&prod->lock); while((prod->writepos+1)%BUFFER_SIZE==prod->readpos) { printf("producer wait for not full\n"); pthread_cond_wait(&prod->notfull,&prod->lock); } prod->buffer[prod->writepos]=data; prod->writepos++; if(prod->writepos>=BUFFER_SIZE) prod->writepos=0; pthread_cond_signal(&prod->notempty); pthread_mutex_unlock(&prod->lock); } int get(struct prodcons *prod) { int data; pthread_mutex_lock(&prod->lock); while(prod->writepos==prod->readpos) { printf("consumer wait for not empty\n"); pthread_cond_wait(&prod->notempty,&prod->lock); } data=prod->buffer[prod->readpos]; prod->readpos++; if(prod->readpos>=BUFFER_SIZE) prod->readpos=0; pthread_cond_signal(&prod->notfull); pthread_mutex_unlock(&prod->lock); return data; } #define OVER (-1) struct prodcons buffer; void *producer(void * data) { int n; for(n=1;n<=5;n++) { printf("producer sleep 1 second...\n"); sleep(1); printf("put the %d product\n",n); put(&buffer,n); } for(n=6;n<=10;n++) { printf("producer sleep 3 second...\n"); sleep(3); printf("put the %d product\n",n); put(&buffer,n); } put(&buffer,OVER); printf("producer stopped\n"); return NULL; } void *consumer(void *data) { int d=0; while(1) { printf("consumer sleep 2 second...\n"); sleep(2); d=get(&buffer); printf("get the %d product\n",d); if(d==OVER) break; } printf("consumer stopped\n"); return NULL; } int main(int argc, char *argv[]) { pthread_t th_a,th_b; void *retval; init(&buffer); pthread_create(&th_a,NULL,producer,0); pthread_create(&th_b,NULL,consumer,0); pthread_join(th_a,&retval); pthread_join(th_b,&retval); return 0; }
相关文章推荐
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
- <linux线程>同步互斥机制之【条件变量】
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
- linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
- 线程通信机制---共享内存:消息传递
- 黑马程序员——线程间通信_等待唤醒机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 线程间同步机制----条件变量
- Java线程之间的通信-等待/通知机制
- 什么是.Net的异步机制(线程间通信) - step 5
- (51)线程间通信,等待唤醒机制
- java同步和互斥 : 线程之间通信
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- Android线程间通信机制
- 线程间通信之等待唤醒机制
- Android线程间通信的Message机制
- java基础——多线程(线程的同步互斥与通信)
- Android消息通信机制(子线程向主线程通信).txt