QQ泡沫乐园 · 免费提供游戏辅助,破解软件,活动资讯,喜欢记得收藏哦!
综合软件_线报活动_游戏辅助_最新电影_最优质的的辅助分享平台

用实验代码演示读者-写者问题,让你轻松掌握!

网络 2023-03-10 02:02

一、实验目的

通过读者—写者事例,熟悉、掌握互斥同步编程。

二、实验内容

模拟实现读者—写者事例,当有读者在读,允许其他读者读;没有读者读,允许写者写;有写者写,则不容许读者读。读者和写者是两个独立的线程,要求实现读者优先,即当有读者在读时,后续读者可以读,当最后一个读者读完才准许写者写,读者和写者线程须要互斥

三、实验代码

#include 
#include 
#include 
#define N_WRITER 5  // writer count
#define N_READER 9  // reader count
#define W_SLEEP 1  // writer sleep
#define R_SLEEP 1  // reader sleep
// pthread type wid array, rid array
pthread_t wid[N_WRITER], rid[N_READER];
// Only one person can write

pthread_mutex_t writeLock = PTHREAD_MUTEX_INITIALIZER;
// Only one person can access readerCnt in the same time.
pthread_mutex_t accessReaderCnt = PTHREAD_MUTEX_INITIALIZER;
int data = 0;
int readerCnt = 0;
void write()
{
	int rd;
	rd = rand() % 1000;
	printf("write %d\n", rd);
	data = rd;
}
void read()
{

读者写者问题 写者优先_指南者变速箱问题_读者写者问题流程图

printf("read %d\n", data); } void *writer() { while (1) { // lock the writeLock pthread_mutex_lock(&writeLock); write(); // unlock the writeLock pthread_mutex_unlock(&writeLock); sleep(W_SLEEP); } pthread_exit((void *)0); } void *reader(void *in)

读者写者问题流程图_指南者变速箱问题_读者写者问题 写者优先

{ while (1) { // lock the accessReaderCnt for increase pthread_mutex_lock(&accessReaderCnt); // increase reader count readerCnt++; if (readerCnt == 1) { // lock the writeLock when the readerCnt equals one pthread_mutex_lock(&writeLock); } // unlock the accessReaderCnt pthread_mutex_unlock(&accessReaderCnt); // output the data value read(); // lock the accessReaderCnt pthread_mutex_lock(&accessReaderCnt); // decrease reader count readerCnt--; if (readerCnt == 0) { // unlock the writeLock pthread_mutex_unlock(&writeLock); } // unlock the accessReaderCnt pthread_mutex_unlock(&accessReaderCnt); sleep(R_SLEEP); } } int main(void) { int i = 0; // create N_READER pthread for reader for (i = 0; i < N_READER; i++) { pthread_create(&rid[i], NULL, reader, NULL); } // create N_WRITER pthread for writer for (i = 0; i < N_WRITER; i++) { pthread_create(&wid[i], NULL, writer, NULL); } // sleep the main thread while (1) { sleep(10); } return 0; }

运行截图

有了计划记得推进,不要原地踏步。