【操作系统原理】【实验4】读者写者问题之读者优先
一、实验目的
通过读者—写者例子,熟悉、掌握互斥同步编程。
二、实验内容
模拟实现读者—写者例子,当有读者在读,允许其他读者读;没有读者读,允许写者写;有写者写,则不允许读者读。读者和写者是两个独立的线程,要求实现读者优先,即当有读者在读时,后续读者可以读,当最后一个读者读完才允许写者写,读者和写者线程需要互斥
三、实验代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#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;
}
运行截图
有了计划记得推动,不要原地踏步。
标签:
操作系统
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~