生产者消费者多线程pthread

上传人:飞*** 文档编号:51731112 上传时间:2018-08-16 格式:PDF 页数:11 大小:115.60KB
返回 下载 相关 举报
生产者消费者多线程pthread_第1页
第1页 / 共11页
生产者消费者多线程pthread_第2页
第2页 / 共11页
生产者消费者多线程pthread_第3页
第3页 / 共11页
生产者消费者多线程pthread_第4页
第4页 / 共11页
生产者消费者多线程pthread_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《生产者消费者多线程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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号