近端时间在学习操作系统中的读者写者问题,参考了很多资料,但是很多资料都是把最后的读者优先、写者优先和公平竞争的代码直接拿来运行的,这样不仅记不住,而且不知道是怎么演变来的
于是我从最基本的,一步一步演变看每个是怎么来的
给心急的朋友先上代码
这里包含了读者优先、写者优先以及公平竞争的代码,只要把宏定义改一改就好了:
读者优先是0 ,写者优先是1,公平是2
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/ipc.h>
#include <sys/sem.h>
//读者优先是0 ,写者优先是1,公平是2
#define mode 2
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
#else
union semun {
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
#endif
int readercount = 0;
int writercount = 0;
int rCountMutex; //控制对rCount的互斥修改,初始值为1
int wMutex;
int rMutex;
int wCountMutex;
int wDataMutex;
int flag;
double readSumTime = 0.0;
double writeSumTime = 0.0;
int perople = 8;
//信号量初始化
static int sem_initail(int semid, int i) {
int ret;
union semun semun;
semun.val = i;
ret = semctl(semid, 0, SETVAL, semun);
if (ret == -1) {
fprintf(stderr, "semctl failed !\n");
}
printf("sem init success :%d\n", i);
}
//对信号量semid的P操作
static int sem_p(int semid) {
int ret;
struct sembuf sembuf;
sembuf.sem_op = -1;
sembuf.sem_num = 0;
sembuf.sem_flg = SEM_UNDO;
ret = semop(semid, & sembuf, 1);
if (ret == -1) {
fprintf(stderr, "sem_p failed\n");
}
return ret;
}
//对信号量semid的v操作
static int sem_v(int semid) {
int ret;
struct sembuf sembuf;
sembuf.sem_op = 1;
sembuf.sem_num = 0;
sembuf.sem_flg = SEM_UNDO;
ret = semop(semid, & sembuf, 1);
if (ret == -1) {
fprintf(stderr, "sem_v failed\n");
}
return ret;
}
void dowrite(int a) {
printf("【第%d号写者】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>开始写文章\n", a + 1);
sleep(1);
printf("【第%d号写者】<<<<<<<<<<<<<<<<<<<<<<<<<<<<<写完文章\n", a + 1);
}
void doread(int b) {
printf("【第%d号读者】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>开始读,此时有%d个人在读\n", b + 1, readercount);
sleep(1);
printf("【第%d号读者】<<<<<<<<<<<<<<<<<<<<<<<<<<<读完文章\n", b + 1);
}
//----------------------------------------------------------------------读者优先↓
void * read_i_reader_first(int a) {
printf("【第%d号读者】想读\n", a + 1);
clock_t start = clock();
sem_p(rCountMutex);
if (readercount == 0)
sem_p(wMutex);
readercount++;
sem_v(rCountMutex);
doread(a);
sem_p(rCountMutex);
readercount--;
if (readercount == 0)
sem_v(wMutex