线程练习
来源:互联网 发布:iphone怎么投屏到mac 编辑:程序博客网 时间:2024/06/18 17:54
/*****************************************************copyright (C), 2014-2015, Lighting Studio. Co., Ltd. File name:Author:Jerey_Jobs Version:0.1 Date: Description:Funcion List: *****************************************************/#include <stdio.h>#include <pthread.h>#define BUFFER_SIZE 16struct prodcons{ int buffer[BUFFER_SIZE]; pthread_mutex_t lock; int readpos,writepos; pthread_cond_t notempty; pthread_cond_t notfull;};void init(struct prodcons *b){ pthread_mutex_init(&b->lock,NULL); pthread_cond_init(&b->notempty,NULL); pthread_cond_init(&b->notfull,NULL); b->readpos = 0; b->writepos = 0;}void put(struct prodcons *b,int data){ pthread_mutex_lock(&b->lock); if((b->writepos + 1) % BUFFER_SIZE == b->readpos) { pthread_cond_wait(&b->notfull,&b->lock); } b->buffer[b->writepos] = data; b->writepos++; if(b->writepos >= BUFFER_SIZE) { b->writepos = 0; } pthread_cond_signal(&b->notempty); pthread_mutex_unlock(&b->lock);}int get(struct prodcons *b){ int data; pthread_mutex_lock(&b->lock); if(b->writepos == b->readpos) { pthread_cond_wait(&b->notempty,&b->lock); } data = b->buffer[b->readpos]; b->readpos++; if(b->readpos >= BUFFER_SIZE) { b->readpos = 0; } pthread_cond_signal(&b->notfull); pthread_mutex_unlock(&b->lock); return data;}#define OVER -1struct prodcons buffer; void * producer(void *data){ int n; for(n = 0;n < 20;n++) { printf("%d----->\n",n); put(&buffer,n); } put(&buffer,OVER); return NULL;}void * consumer(void *data){ int d; while(1) { d = get(&buffer); if(d == OVER) break; printf("----->%d\n",d); } return NULL;}int main(){ 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;}
0 0
- 线程练习
- 线程练习
- 线程练习
- 线程练习
- 线程练习
- C# 线程练习1
- 线程池练习
- 线程池练习
- linux 线程练习
- win32练习-线程挂起
- unix练习-线程互斥量
- 线程的编程练习
- 线程的编程练习
- 线程的编程练习
- 线程编程练习
- 线程练习2
- 线程编程练习2
- java线程池练习
- 仅仅是声音
- 第11天 自定义异常、权限修饰符、jar包、清除重复元素
- NOIP2016 DAY1
- strcmp实现
- 从session里面取得值为null
- 线程练习
- Mathematica 之 module
- 计算机网络之NAT
- Redis BitMap适应场景
- 停车场管理系统
- Laravel5.3学习笔记
- Easyui 基础布局和静态菜单栏
- 【opencv】双目视觉下空间坐标计算
- OleDbDataAdapter 的Update语句执行时提示“insert into语法错误”解决方法