上一篇文章中,我们通过增加一个变量作为标识,从而判断出读者和写者所共享的缓冲区是否有内容,从而实现读写交替,而不是一个线程不停的运行,另外一个“饿死”。
实际上,操作系统里出了互斥锁,还提供了信号量来实现并发情况下的同步。
/**
**读写互斥问题
**读的时候不能写,写的时候不能读
**读写交替(使用信号量)
**/
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
//声明一把互斥锁
pthread_mutex_t mutex;
sem_t sem;
void writer(void)
{
while(1)
{
sem_post(&sem);//V操作,信号量+1
pthread_mutex_lock(&mutex);//加锁
printf("writer加锁成功,开始写...\n");
sleep(5);
printf("writer写操作结束,释放互斥锁\n");
pthread_mutex_unlock(&mutex);//释放互斥锁
}
}
void reader(void)
{
while(1)
{
sem_wait(&sem);//P操作,信号量-1
pthread_mutex_lock(&mutex);//加锁
printf("reader加锁成功,开始读...\n");
sleep(5);
printf("reader读操作结束,释放互斥锁\n");
pthread_mutex_unlock(&mutex);//释放互斥锁
}
}
int main(void)
{
printf("初始化互斥锁\n");
pthread_mutex_init(&mutex,NULL);
printf("初始化信号量\n");
sem_init(&sem,0,0);
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;
}
这里我们通过引入信号量(sem_t )类型的变量来解决共享缓冲区判断问题,这里要注意的一个地方是PV操作的位置以及互斥锁的加锁和信号量的PV操作顺序问题。
首先讨论一下PV操作的位置。P在我们的程序中就是sem_post()函数,作用是对信号量进行加1,这里很显然我们应该将P操作放在写者的线程中。同理,读者中的sem_wait()函数代表的就是V操作,作用是对信号量进行减1,很显然应该放在读者线程中。
关于PV操作和加锁的先后顺序。我最开始是先加锁,再进行P或者V,但是运行的时候我发现程序完全阻塞了,没有任何输出,分析了一下原因:如果是读者先加锁,加锁成功,然后进行V操作,这个时候因为信号量初始值为0,所以进入阻塞。我们再来看写者会是什么情况,写者试图加锁,因为读者已经加锁了,所以阻塞。至此,两个线程全部阻塞。。。所以要注意,一定是先P或者V操作,再进行加锁,否则会造成全部阻塞的死锁现象。
分享到:
相关推荐
thread:未使用windows互斥信号量程序 thread2:使用windows互斥信号量程序 thread3:使用同步机制的peterson软件解决方案
操作系统_进程同步算法习题精选.ppt
实验一、进程控制实验 ...实验三、进程调度算法实验 实验四、进程同步实验 实验五、进程互斥实验 实验六、死锁问题实验 实验七、内存页面置换算法实验 实验八、磁盘移臂调度算法实验 实验九、文件系统接口实验
3.内容:基于5G通信系统的时间同步算法matlab仿真。 5G通信系统的时间同步需求主要源于对基站空口时间偏差的严格限定,这主要是为了避免上下行时隙干扰。对于4G TDD系统,采用固定子载波间隔15kHz,保护周期GP...
本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。 三. 实验题目 模拟PV操作同步机构,且用PV操作解决生产者—消费者问题。 运行环境:Microsoft Visual Studio ...
银行家算法在安全检查时用了两种不同方式 调度算法实现了先来先服务和短作业优先 页面置换实现了FIFO和LRU
适用操作系统第3版微课版
操作系统实验报告_进程同步与互斥.doc
用银行家算法避免死锁,实现系统合理分配资源,加深对进程同步及死锁理解。
设计1:动态异长分区的存储分配与回收算法。 设计2:哲学家就餐问题与死锁。 设计3:假脱机打印程序与虚拟设备。 设计4:读者写者问题与进程同步。 设计5:索引文件,计算在混合索引文件的组织方式下,一个文件的...
操作系统进程同步和互斥的实验报告。。。关于操作系统进程的同步与互斥问题的实验报告。
操作系统\进程同步补充习题算法最多允许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.领域:matlab,OFDM系统同步算法 2.内容:mOFDM系统下对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析+程序操作视频+word版说明文档 3.用处:用于SC算法,Minn算法,PARK算法同步性能编程学习 4.指向...
[计算机]操作系统 课程设计报告【生产者消费者同步算法】.doc
实训的基本原理主要包括操作系统中的进程的同步与互斥;常用的进程调度算法;地址重定位;动态页式存储管理技术的页面淘汰算法;设备管理中设备的分配和回收;用死锁避免方法来处理申请独占设备可能造成的死锁;...
计算机及其网络分布式系统中的时钟同步,还有一些经典同步算法,很不错的
小实验三:根据同步机制的Peterson软件解决方案尝试自己编程实现线程同步机制和用于上述线程并发问题的解决,并基于程序运行时间长短将其与基于Windows互斥信号量的线程同步机制的效率展开比较。 实验要求:线程主体...
《计算机操作系统》可作为计算机硬件和软件以及计算机通信专业的本科生教材,也可作为从事计算机及通信工作的相关科技人员的参考书。 目录 第一章 操作系统引论 1.1 操作系统的目标和作用 1 1.1.1 操作系统的...
因此要求:①允许多个读者可以同时对文件执行读操作;②只允许一个写者往文件中写信息;③任一写者在完成写操作之前不允许其他读者或写者工作;④写者执行写操作前,应让已有的读者和写者全部退出。