2021SC@SDUSC
项目环境:
- 树莓派4b
- Ubuntu Desktop 21.04
读者写者问题:
读者写者问题是非常经典的进程同步问题,下面分析代码中两种不同版本的读者写者问题,分别为写者优先和读者优先。
写者优先:
在读者优先中,如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <sys/types.h>
# include <pthread.h>
# include <semaphore.h>
# include <string.h>
# include <unistd.h>
//semaphores
sem_t wrt, mutex;
int readCount;
struct data {
int id;
int opTime;
int lastTime;
};
void* Reader(void* param) {
int id = ((struct data*)param)->id;
int lastTime = ((struct data*)param)->lastTime;
int opTime = ((struct data*)param)->opTime;
sleep(opTime);
printf("Thread %d: waiting to read\n", id);
sem_wait(&mutex);
readCount++;
if(readCount == 1)
sem_wait(&wrt);
sem_post(&mutex);
printf("Thread %d: start reading\n", id);
sleep(lastTime);
printf("Thread %d: end reading\n", id);
sem_wait(&mutex);
readCount--;
if(readCount == 0)
sem_post(&wrt);
sem_post(&mutex);
pthread_exit(0);
}
void* Writer(void* param) {
int id = ((struct data*)param)->id;
int lastTime = ((struct data*)param)->lastTime;
int opTime = (