计算机操作系统--读写者问题

604 篇文章 8 订阅
579 篇文章 5 订阅

目标:1.5个读者,一个写者;

             2.读者可以并行读,写者和读者必须互斥

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <semaphore.h>

sem_t sem_r,sem_w;
int Flags=0;
pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;
void* reader(void*);
void* writer(void*);

int main(int argc,char** argv){
pthread_t sid_r[5],sid_w;
int rc1=0,rc2=0;
  int res1,res2,i=0;
res1 = sem_init(&sem_r, 0, 5);
res2 = sem_init(&sem_w, 0, 1);
  if (res1 != 0)
    {
        perror("Sem1 init failed");
        exit(EXIT_FAILURE);
    }
if (res2 != 0)
    {
        perror("Sem2 init failed");
        exit(EXIT_FAILURE);
    }

for(i=0;i<5;i++){
rc1=pthread_create(&sid_r[i],NULL,reader,NULL);
if(0!=rc1){
//printf("%s:%d\n",_func_,strerror(rc1));
printf("error threads1\n");
}
printf("creast %d reader\n ",i+1);
}
rc2=pthread_create(&sid_w,NULL,writer,NULL);
if(0!=rc2){
//printf("%s:%d\n",_func_,strerror(rc2));
printf("error threads2\n");
}
// pthread_join(sid_r,NULL);
 pthread_join(sid_w,NULL);

pthread_mutex_destroy(&mutex);
sem_destroy(&sem_r);
sem_destroy(&sem_w);
printf("exit\n");
pthread_cond_destroy(&cond);
//exit(0);
return 0;
}

void* reader(void*arg ){
printf("enter reader\n");
sem_wait(&sem_w);
sem_wait(&sem_r);
pthread_mutex_lock(&mutex);
printf("call thread_reader \n");
pthread_mutex_unlock(&mutex);
sem_post(&sem_r);
sem_post(&sem_w);
sleep(1);
}

void* writer(void * arg){
printf("enter writer\n");
sem_wait(&sem_w);
pthread_mutex_lock(&mutex);
printf("call thread_writer \n");
pthread_mutex_unlock(&mutex);
sem_post(&sem_w);
sleep(1);
}

结果:

[root@localhost test.threads]# ./test
creast 1 reader
 creast 2 reader
 creast 3 reader
 creast 4 reader
 creast 5 reader
 enter reader
call thread_reader 
enter reader
call thread_reader 
enter reader
call thread_reader 
enter writer
call thread_writer 
enter reader
call thread_reader 
enter reader
call thread_reader 
exit

说明:代码很粗糙,仅作学习线程使用,没有优化和修改。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值