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

22 篇文章 0 订阅

#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;

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值