【多线程同步】一步一步演变读者写者问题(读者优先,写者优先,公平竞争)

本文详细介绍了操作系统中经典的读者写者问题,通过逐步演进来阐述读者优先、公平竞争和写者优先三种策略。作者提供了一系列C++代码示例,展示了不同版本的实现,并分析了它们的执行效果和设计思路,强调理解代码背后的逻辑至关重要。
摘要由CSDN通过智能技术生成

近端时间在学习操作系统中的读者写者问题,参考了很多资料,但是很多资料都是把最后的读者优先、写者优先和公平竞争的代码直接拿来运行的,这样不仅记不住,而且不知道是怎么演变来的
于是我从最基本的,一步一步演变看每个是怎么来的

给心急的朋友先上代码

这里包含了读者优先、写者优先以及公平竞争的代码,只要把宏定义改一改就好了:
读者优先是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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值