读者写者问题的三种打开方式——公平竞争
在上一篇中,我们实现了读者写者问题中的读者优先策略,也提及了读者优先存在的问题,即写者饥饿。在这一篇中,我们会实现公平竞争策略。先看代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <semaphore.h>
#include <time.h>
#define M_SIZE 1024
#define SLEEP_TIME 1
#define R_SIZE 10
#define W_SIZE 10
#define RW_SIZE 20
struct SHM
{
sem_t rc_sem;
sem_t db_sem;
sem_t r1_or_w1_sem; //
int rc;
int value;
};
void shmInit(struct SHM* shm_p)
{
sem_init(&shm_p->rc_sem, 1, 1);
sem_init(&shm_p->db_sem, 1, 1);
sem_init(&shm_p->r1_or_w1_sem, 1, 1); //比读者优先多一个信号量
shm_p->rc = 0;
shm_p->value = 0;
}
void shmDestroy(struct SHM* shm_p)
{
sem_destroy(&shm_p->rc_sem);
sem_destroy(&shm_p->db_sem);
sem_destroy(&shm_p->r1_or_w1_sem);
}
void readerFunc(struct SHM* shm_p)
{
while(1)
{
sem_wait(&shm_p->r1_or_w1_sem);
sem_wait(&shm_p->rc_sem);
++shm_p->rc;
if (shm_p->rc == 1)
{
sem_wait(&shm_p->db_sem);
}
sem_post(&shm_p->rc_sem);
sem_post(&shm_p->r1_or_w1_sem);
printf("%d, %ld\n"