用互斥锁解决读者-写者问题
2012-04-05 10:33
85 查看
#include<pthread.h>#include<stdio.h>/*读-写的次数限制,防止程序无限制的运行*/#define Max_time 12 void * read(void *pread);void * write(void *pwrite);void init_time(); char buffer;/* 确定缓冲区中是否有数据 */int buffer_has_item=0;/*产生一个数据*/char make_new_item();/*消费这个数据*/void consume_item(char c);/*声明一个锁*/pthread_mutex_t mutex; /*计算延迟用的数据结构*/struct time_struct{ int read; int write;} record_time; int main(int argc,char* argv[]){ /*声明读-写两个线程*/ pthread_t reader,writer; /* int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);*/ pthread_mutex_init(&mutex,NULL); /* 初始化时间变量 */ init_time(); /*创建两个线程*/ pthread_create(&writer,NULL,&write,NULL); pthread_create(&reader,NULL,&read,NULL); pthread_exit(NULL);} /* write 线程的函数入口 */void * write(void *pwrite){ while(record_time.write<Max_time) { /* 使用共享区之前,先锁住锁变量,防止出现竞争条件 函数声明如下: int pthread_mutex_lock(pthread_mutex_t *mutex);*/ pthread_mutex_lock(&mutex); /*检查缓冲区没有数据 注意:buffer_has_item也是共享的资源,同样可能引发竞争条件*/ if(buffer_has_item==0) { /*向缓冲区中写入数据*/ buffer=make_new_item(); (record_time.write)++; printf("%d write\n",record_time.write); /*标明缓冲区中已经有数据了*/ buffer_has_item=1; } /*使用完以后开锁,以使其他线程可以使用共享区*/ pthread_mutex_unlock(&mutex); } pthread_exit(NULL);} void * read(void *pread){ while(record_time.read<Max_time) { pthread_mutex_lock(&mutex); if(buffer_has_item==1) { consume_item(buffer); (record_time.read)++; printf("%d read\n",record_time.read); buffer_has_item=0; } pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } char make_new_item(){ return('a');} void consume_item(char c){ return;} void init_time(){ record_time.read=0; record_time.write=0;}
相关文章推荐
- 用信号量解决读者写者问题
- 用信号量解决读者写者问题
- 使用读写锁解决读者-写者问题
- 读者写者问题——读者优先,写者优先,公平竞争 解决方法
- 用信号量解决读者写者问题
- 线程读写锁解决读者-写者问题
- 互斥量和条件变量解决读者-写者问题
- 用信号量解决读者写者问题
- 使用信号量解决读者写者问题--读者优先
- Linux多线程实践(6) --Posix读写锁解决读者写者问题
- 用信号量解决读者写者问题
- 使用信号量解决读者写者问题--读者优先
- Linux多线程实践(6) --Posix读写锁解决读者写者问题
- 用信号量解决读者写者问题
- 信号量解决读者-写者问题
- Linux多线程实践(6) --Posix读写锁解决读者写者问题
- 用信号量解决读者写者问题
- 用信号量解决读者写者问题
- 用信号量解决读者写者问题
- 用信号量和读写锁解决读者写者问题