在OS读者和写者问题中,不管是读者优先还是写者优先,都必须确保读者或写者具有共享精神
读者优先:
在读者获得文件资源时,确保所有的读者都完成认为后再释放文件资源
写者优先:
在写者获得文件资源时,确保当前写者阻塞队列中的所有写者都完成写操作再释放资源
注:任何一方要优先,就必须让自身具有共享精神。
1、写者优先
此展示代码中,RWmutex相当于把所有的请求进程进行分类,分为读者部分和写者部分,第一个写者抢到资源后,必须确保当前所有的写者都完成写操作,此时写者占有绝对的优先权,因此为写者优先
代码实现:(读写锁)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#define NUM 20
void readFile(int id);
void writeFile(int id);
void randomSleep();
void* reader(void *id);
void* writer(void *id);
int readerNum = 0, writerNum = 0;
pthread_rwlock_t rwlock;
int main(void)
{
int id[NUM];
int i;
pthread_t readThread[NUM], writeThread[NUM];
pthread_rwlock_init(&rwlock, NULL); //init lock
srand((unsigned int)time(NULL));
for(i = 0; i < NUM; i++)
{
id[i] = i; //record pid
pthread_create(&readThread[i], NULL, reader, (void*)&id[i]);
pthread_create(&writeThread[i], NULL, writer, (void*)&id[i]);
}
for(i = 0; i < NUM; i++)
{
pthread_join(readThread[i], NULL);
pthread_join(writeThread[i], NULL);
}
pthread_exit(0); // main thread exit
}
void *reader(void *id)
{
randomSleep();
pthread_rwlock_rdlock(&rwlock);
readerNum++;
readFile(*((int*)id));
readerNum--;
pthread_rwlock_unlock(&rwlock);
}
void *writer(void *id)
{
randomSleep();
pthread_rwlock_wrlock(&rwlock);
writerNum++;
writeFile(*((int*)id));
writerNum--;
pthread_rwlock_unlock(&rwlock);
}
void randomSleep()
{
struct timespec tv;
tv.tv_sec = 0; //秒
tv.tv_nsec = (long)(rand()*1.0/RAND_MAX * 999999999); //纳秒
nanosleep(&tv, NULL);
}
void readFile(int id)
{
printf("reader ID: %d; reader num: %d; writer num: %d\n", id, readerNum,writerNum);
randomSleep();
}
void writeFile(int id)
{
printf("writer ID: %d; reader num: %d; writer num: %d\n", id, readerNum,writerNum);
randomSleep();
}