#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;
}
用互斥锁解决读者-写者问题
最新推荐文章于 2020-07-05 08:57:36 发布