《生产者消费者多线程pthread》由会员分享,可在线阅读,更多相关《生产者消费者多线程pthread(11页珍藏版)》请在金锄头文库上搜索。
1、1.互斥#include #include #define BUFFER_SIZE 4 #define OVER (-1) struct producers/ 定义生产者条件变量结构 int bufferBUFFER_SIZE; /定义缓冲区 pthread_mutex_t lock; /访问缓冲区的互斥锁 int readpos, writepos; /读写的位置 pthread_cond_t notempty; /缓冲区有数据时的标记 pthread_cond_t notfull; /缓冲区未满的标记 ; /初始化缓冲区 void init(struct producers *b) /参数
2、即为一个结构体,要struct , /定义时不用 typedef pthread_mutex_init( pthread_cond_init( pthread_cond_init( /初始化相关量 b-readpos=0; b-writepos=0;/ 开始位置都为 0 /在缓冲区存放一个整数 void put(struct producers *b, int data) /两个参数,其中一个为数据 pthread_mutex_lock( /在 put 函数中完成互斥 /当缓冲区为满时等待 while(b-writepos+1)%BUFFER_SIZE=b-readpos) /满的条件是两个游
3、标相邻 pthread_cond_wait( /在返回之前, pthread_con_wait需要参数 b.lock b-bufferb-writepos=data; /否则在写的位置写入数据 b-writepos+;/ 游标加一 if(b-writepos=BUFFER_SIZE) b-writepos=0; /满时,写位置置 0 /发送当前缓冲区中有数据的信号 pthread_cond_signal(/ pthread_mutex_unlock( /从缓冲区读数据并将数据移走 int get(struct producers *b) int data; pthread_mutex_lock
4、( while(b-writepos=b-readpos)/此时无数据可读,阻塞 pthread_cond_wait( data=b-bufferb-readpos; /否则读数据 b-readpos+; if(b-readpos=BUFFER_SIZE) b-readpos=0; pthread_cond_signal( pthread_mutex_unlock( return data;/ 返回读的数据 struct producers buffer;/ 事先要定义这个全局变量 void *producer(void *data) /参数应该为 void,与上面的 data 无关 int
5、n; for(n=0;nn“,n); put( put( return NULL; void *consumer(void *data) int d; while(1) d=get( if(d=OVER) break; printf(“Consumer: %dn“,d); return NULL; int main() pthread_t tha,thb; void *retval; init( pthread_create( pthread_create( pthread_join(tha, pthread_join(thb, return 0; 2.用条件变量#include #inclu
6、de #define BUFFER_SIZE 8 #define OVER (-1) struct producers /定义生产者条件变量结构 int bufferBUFFER_SIZE; /缓冲区 pthread_mutex_t lock; /互斥 LOCK int readpos , writepos; /读写位置 pthread_cond_t notempty; /缓冲区非空条件判断 pthread_cond_t notfull; /缓冲区未满条件判断 ; void init(struct producers * b)/初始化缓冲区 pthread_mutex_init( pthrea
7、d_cond_init( pthread_cond_init( b-readpos=0; b-writepos=0; /缓冲区刚开始的情况void put(struct producers * b,int data)/缓冲区中放入一个数据 pthread-_mutex_lock( /当缓冲区为满时等待 ,即写的位置前移一个就是写的位置了 if(b-writepos + 1) % BUFFER_SIZE = b-readpos) pthread_cond_wait(/此时已满,要等信号 notfull 才能写。 所要做的工作是释放mutex 互斥锁,并且阻塞条件变量,直到信号被唤醒,在 阻塞前自
8、动释放互斥锁,在返回前自动获得它/在返回之前,需要参数b-lock b-bufferb-writepos=data;/向缓冲区写数据,指针前移 b-writepos+; if(b-writepos = BUFFER_SIZE) b-writepos=0;/ 写满后调头 /发送当前缓冲区有数据信号 pthread_cond_signal(/使得关于参数 notempty 而阻塞的线程退 出阻塞状态,并且要在同一个互斥锁的保护下使用; pthread_mutex_unlock(/解锁 /读数据并移走 int get(struct prodcons *b) int data; pthread_mut
9、ex_lock(/当缓冲区有数据时等待 if(b-writepos = b-readpos) pthread_cond _wait( data = b-bufferb-readpos; b-readpos+;/ 读数据,指针前移if(b-readpos = BUFFER_SIZE)b-readpos=0; /发送当前缓冲区未满信号 pthread_cond_signal( pthread_mutex_unlock( return data; struct prodcons buffer; void *producer(void *data) int n; for(n = 0; n #inclu
10、de #include #define BUFFER_SIZE 8 #define OVER (-1) struct producers /定义生产者条件变量结构 int bufferBUFFER_SIZE; /缓冲区 sem_t sem_read; sem_t sem_write; int readpos , writepos; /读写位置 ; void init(struct producers * b)/初始化缓冲区 b-readpos=0; b-writepos=0; sem_init( sem_init(/初始化一个定位在sem 的匿名信号量。 value 参数 指定信号量的初始值。
11、pshared 参数指明信号量是由进程内线程共享,还是由 进程之间共享 void put(struct producers * b,int data)/缓冲区中放入一个数据 sem_wait( b-bufferb-writepos=data; b-writepos+; if(b-writepos=BUFFER_SIZE)b-writepos=0; sem_post( /读数据并移走 int get(struct prodcons *b) int data; sem_wait(/从信号量的值减去一个 “1”, 但它永远会先等待该信 号量为一个非零值才开始做减法data=b-bufferb-rea
12、dpos; b-readpos+; if(b-readpos=BUFFER_SIZE)b-readpos=0; sem_post( return data; struct prodcons buffer; void *producer(void *data) int n; for(n = 0; n 10000; n+) printf(“%d n“, n) ; put( put( return NULL; void *consumer(void * data) int d; while(1) d = get( if(d = OVER) break; printf(“%dn“, d); retur
13、n NULL; int main(void) pthread_t th_a, th_b; void *retval; init( pthread_create( pthread_create( pthread_join(th_a, pthread_join(th_b, return 0; Pthread 库 API 参考Pthread Functions Thread pthread_create Management pthread_exit pthread_join pthread_once pthread_kill pthread_self pthread_equal pthread_y
14、ield pthread_detach Thread-Specific Data pthread_key_create pthread_key_delete pthread_getspecific pthread_setspecific Thread Cancellation pthread_cancel pthread_cleanup_pop pthread_cleanup_push pthread_setcancelstate pthread_getcancelstate pthread_testcancel Thread Scheduling pthread_getschedparam
15、pthread_setschedparam Signals pthread_sigmask Pthread Attribute Functions Basic Management pthread_attr_init pthread_attr_destroy Detachable or Joinable pthread_attr_setdetachstate pthread_attr_getdetachstate Specifying Stack Information pthread_attr_getstackaddr pthread_attr_getstacksize pthread_attr_setstackaddr pthread_attr_setstacksize Thread Scheduling Attributes pthread_a