上一篇文章中,我们已经通过多线程以及互斥锁来实现了读写互斥的简单的读者写者算法。由于这种设计会存在一种线程“饿死”的情况,这里我们进行一下简单的改进,使得读写操作能够互斥并且交替的进行。
/**
**读写互斥问题
**读的时候不能写,写的时候不能读
**读写交替
**/
#include<stdio.h>
#include<pthread.h>
//声明一把互斥锁
pthread_mutex_t mutex;
//声明是否有内容可读的标志
int hasContent = 0;
void writer(void)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(hasContent == 0)
{
printf("writer加锁成功,开始写...\n");
sleep(2);
hasContent = 1;
printf("writer写操作结束,释放互斥锁\n");
}
pthread_mutex_unlock(&mutex);
}
}
void reader(void)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(hasContent == 1)
{
printf("reader加锁成功,开始读...\n");
sleep(2);
hasContent = 0;
printf("reader读操作结束,释放互斥锁\n");
}
pthread_mutex_unlock(&mutex);
}
}
int main(void)
{
printf("初始化互斥锁\n");
pthread_mutex_init(&mutex,NULL);
pthread_t thread_writer;
pthread_t thread_reader;
printf("开始读写线程\n");
pthread_create(&thread_reader,NULL,(void *)reader,NULL);
pthread_create(&thread_writer,NULL,(void *)writer,NULL);
printf("回收线程\n");
pthread_join(thread_reader,NULL);
pthread_join(thread_writer,NULL);
printf("运行结束\n");
return 0;
}
相比于上一篇文章中的代码,这里最主要的改进就是增加了一个是否有文章可读的变量作为判断标识int hasContent=0,初始化为0表示默认是没有可读的内容的。
当读者线程开始运行后,首先进行加锁,如果加锁成功,判断是否有内容可读,如果没有,则不进行读操作,直接解锁,从而快速让出互斥锁的加锁权,让写者有机会加锁并写入内容。如果有内容可读,则进行读操作。
当写者线程开始运行后,首先进行加锁,如果加锁成功,判断是否内容已经被读者读完了,如果还没被读完,则不进行写操作,直接解锁,从而快速让出互斥锁的加锁权,让读者有机会加锁并读取内容。如果内容已经被读者读完了,则进行写操作。
可以简单理解为这是一种具有长度为1的缓冲区的读者写者问题。
分享到:
相关推荐
thread:未使用windows互斥信号量程序 thread2:使用windows互斥信号量程序 thread3:使用同步机制的peterson软件解决方案
操作系统_进程同步算法习题精选.ppt
实验二、线程和进/线程管道通信实验 实验三、进程调度算法实验 实验四、进程同步实验 实验五、进程互斥实验 实验六、死锁问题实验 实验七、内存页面置换算法实验 实验八、磁盘移臂调度算法实验 实验九、文件...
适用操作系统第3版微课版
用银行家算法避免死锁,实现系统合理分配资源,加深对进程同步及死锁理解。
3.内容:基于5G通信系统的时间同步算法matlab仿真。 5G通信系统的时间同步需求主要源于对基站空口时间偏差的严格限定,这主要是为了避免上下行时隙干扰。对于4G TDD系统,采用固定子载波间隔15kHz,保护周期GP...
本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。 三. 实验题目 模拟PV操作同步机构,且用PV操作解决生产者—消费者问题。 运行环境:Microsoft Visual Studio ...
银行家算法在安全检查时用了两种不同方式 调度算法实现了先来先服务和短作业优先 页面置换实现了FIFO和LRU
设计1:动态异长分区的存储分配与回收算法。 设计2:哲学家就餐问题与死锁。 设计3:假脱机打印程序与虚拟设备。 设计4:读者写者问题与进程同步。 设计5:索引文件,计算在混合索引文件的组织方式下,一个文件的...
操作系统实验报告_进程同步与互斥.doc
操作系统进程同步和互斥的实验报告。。。关于操作系统进程的同步与互斥问题的实验报告。
操作系统\进程同步补充习题算法最多允许4个哲学家同时进餐。 算法: Var n:semaphore:=4; Chopstick:array[0…4] of semaphore:=1,1,1,1,1; Begin Parbegin Chopsticki:repeat Wait(n); Wait(chopstick...
北大自考操作系统上机七个算法的完整代码。这七个算法会了,北大自考操作系统上机就是优秀了。我就是这样得到的优秀。跟大家分享下。10分很值哦。
1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,...编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
1.领域:matlab,OFDM系统同步算法 2.内容:mOFDM系统下对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析+程序操作视频+word版说明文档 3.用处:用于SC算法,Minn算法,PARK算法同步性能编程学习 4.指向...
[计算机]操作系统 课程设计报告【生产者消费者同步算法】.doc
计算机及其网络分布式系统中的时钟同步,还有一些经典同步算法,很不错的
小实验二:使用Windows互斥信号量操作函数解决上述线程并发问题,并分析、尝试和讨论线程执行体中有关信号量操作函数调用的正确位置 小实验三:根据同步机制的Peterson软件解决方案尝试自己编程实现线程同步机制和...
因此要求:①允许多个读者可以同时对文件执行读操作;②只允许一个写者往文件中写信息;③任一写者在完成写操作之前不允许其他读者或写者工作;④写者执行写操作前,应让已有的读者和写者全部退出。
操作系统实训报告进程同步和互斥通过实现哲学家进餐问题的同步深入了解和掌握进程同步和互斥的原理。哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀...