您的位置:首页 > 其它

用互斥锁解决读者-写者问题

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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: