情形1:读者优先
特点
- 多名读者可以同时读
- 写者写时储存区只有写者一个人
- 有读者在读时,未进入储存区的读者和写者不公平地竞争,体现在:写者不可能开始写,但读者可以读
- 只有当储存区没有读者时(但可能有一名写者,也可能空无一人),读者和写者才公平地竞争
伪码
int read_count = 0;
semaphore read_count_lock = 1;
semaphore wsem = 1;
reader(){
wait(read_count_lock);
read_count++;
if(read_count==1) wait(wsem);
signal(read_count_lock);
READ_PROCESS();
wait(read_count_lock);
read_count--;
if(read_count==0) signal(wsem);
signal(read_count_lock);
}
writter(){
wait(wsem);
WRITE_PROCESS();
signal(wsem);
}
解释
- 多名读者可以同时读体现在READ_PROCESS()前后没有信号量抢锁语句
- 因为写者需要wait(wsem)才能进入写过程,而只要储存区还有一名读者,wsem就被读者持有,故写者无法进行写
- 当储存区没有读者时,wsem值为1,读者和写者公平地竞争wsem
代码
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t wsem,read_count_lock;
int read_count;
int memory;
void init(){
sem_init(&wsem,0,1);
sem_init(&read_count_lock,0,1);
memory = 0;
read_count = 0;
}
void reader(){
while(1){
sem_wait(&read_count_lock);
read_count++;
if(read_count==1) sem_wait(&wsem);
sem_post(&read_count_lock);
READ_PROCESS();
sem_wait(&read_count_lock);
read_count--;
if(read_count==0) sem_post(&wsem);
sem_post(&read_count_lock);
}
}
void READ_PROCESS(){
printf("READ:%dn",memory);
//sleep(1);
}
void writer(){
while(1){
sem_wait(&wsem);
WRITE_PROCESS();
sem_post(&wsem);
}
}
void WRITE_PROCESS(){
me