考研 操作系统:读者-写者问题

问题描述:有读者和写者两组并发进程,共享一个文件,当两个或者以上的都进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或者写进程)同时访问共享数据时,则可能导致数据不一致的错误。因此要求:1.允许多个读者同时访问同一个数据,不允许读者和写者,写者和写者同时访问数据。任一写者在访问完数据前不允许其他进程进来访问。

在linux下实现读写竞争问题(用线程来表示进程竞争)

#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <condition_variable>
#include <fstream>
#include <iostream>
#include <mutex>
#include <thread>

/*共享资源*/
pthread_mutex_t mutex;
pthread_mutex_t mtx;
pthread_cond_t cond;
int readcount = 0;

void* reader(void* args) {
  while (true) {
    pthread_mutex_lock(&mutex);
    if (readcount == 0) { /*当第一个读者进来,不允许写者执行*/
      pthread_mutex_lock(&mtx);
    }
    readcount++;
    pthread_mutex_unlock(&mutex);

    sleep(1);
    std::cout << "Reading......" << std::endl;

    pthread_mutex_lock(&mutex);
    readcount--;
    if (readcount == 0) {
      pthread_mutex_unlock(&mtx);
    }
    pthread_mutex_unlock(&mutex);
  }
}

void* writer(void* args) {
  while (true) {
    pthread_mutex_lock(&mtx);
    sleep(1);
    std::cout << "writing!!!!!" << std::endl;
    pthread_mutex_unlock(&mtx);
  }
}

int main() {
  pthread_mutex_init(&mutex, NULL);
  pthread_mutex_init(&mtx, NULL);

  pthread_t readers[3], writers[3];

  for (int i = 0; i < 3; i++) {
    pthread_create(&writers[i], NULL, writer, NULL);
    pthread_create(&readers[i], NULL, reader, NULL);
  }

  for (int i = 0; i < 3; i++) {
    pthread_detach(writers[0]);
    pthread_detach(readers[i]);
  }

  while (true) {
    ;
  }

  return 0;
}

以上代码存在一个问题,当读者一直出现时,会使写者陷入饥饿。
修改后代码

#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <condition_variable>
#include <fstream>
#include <iostream>
#include <mutex>
#include <thread>

/*共享资源*/
pthread_mutex_t mutex;
pthread_mutex_t mtx;
pthread_mutex_t w;
pthread_cond_t cond;
int readcount = 0;

void* reader(void* args) {
  while (true) {
    pthread_mutex_lock(&w);
    pthread_mutex_lock(&mutex);
    if (readcount == 0) { /*当第一个读者进来,不允许写者执行*/
      pthread_mutex_lock(&mtx);
    }
    readcount++;
    pthread_mutex_unlock(&mutex);
    pthread_mutex_unlock(&w);
    sleep(1);
    std::cout << "Reading......" << std::endl;

    pthread_mutex_lock(&mutex);
    readcount--;
    if (readcount == 0) {
      pthread_mutex_unlock(&mtx);
    }
    pthread_mutex_unlock(&mutex);
  }
}

void* writer(void* args) {
  while (true) {
    pthread_mutex_lock(&w);
    pthread_mutex_lock(&mtx);
    sleep(1);
    std::cout << "writing!!!!!" << std::endl;
     pthread_mutex_unlock(&w);
    pthread_mutex_unlock(&mtx);
  }
}

int main() {
  pthread_mutex_init(&mutex, NULL);
  pthread_mutex_init(&mtx, NULL);
  pthread_mutex_init(&w, NULL);

  pthread_t readers[3], writers[3];

  for (int i = 0; i < 3; i++) {
    pthread_create(&writers[i], NULL, writer, NULL);
    pthread_create(&readers[i], NULL, reader, NULL);
  }

  for (int i = 0; i < 3; i++) {
    pthread_detach(writers[0]);
    pthread_detach(readers[i]);
  }

  while (true) {
    ;
  }

  return 0;
} 

以上代码提高了写者的优先级,当写者出现时,都进程完成后,优先执行写进程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值