问题描述:有读者和写者两组并发进程,共享一个文件,当两个或者以上的都进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或者写进程)同时访问共享数据时,则可能导致数据不一致的错误。因此要求: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;
}
以上代码提高了写者的优先级,当写者出现时,都进程完成后,优先执行写进程