与上一篇《秒杀多线程第十篇 生产者消费者问题》的生产者消费者问题一样,读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。
上面是读者写者问题示意图,类似于生产者消费者问题的分析过程,首先来找找哪些是属于“等待”情况。
第一.写者要等到没有读者时才能去写文件。
第二.所有读者要等待写者完成写文件后才能去读文件。
找完“等待”情况后,再看看有没有要互斥访问的资源。由于只有一个写者而读者们是可以共享的读文件,所以按题目要求并没有需要互斥访问的资源。类似于上一篇中美观的彩色输出,我们对生产者输出代码进行了颜色设置(在控制台输出颜色设置参见《VC 控制台颜色设置》)。因此在这里要加个互斥访问,不然很有可能在写者线程将控制台颜色设置还原之前,读者线程就已经有输出了。所以要对输出语句作个互斥访问处理,修改后的读者及写者的输出函数如下所示:
读者线程输出函数所使用的可变参数详见《C,C++中使用可变参数》。
解决了互斥输出问题,接下来再考虑如何实现同步问题。可以设置一个变量来记录正在读文件的读者个数,第一个开始读文件的读者要负责将关闭允许写者进入的标志,最后一个结束读文件的读者要负责打开允许写者进入的标志。这样第一种“等待”情况就解决了。第二种“等待”情况是有写者进入时所以读者不能进入,使用一个事件就可以完成这个任务了——所有读者都要等待这个事件而写者负责触发事件和设置事件为未触发。详细见代码中注释:
运行结果如下所示:
根据结果可以看出当有读者在读文件时,写者线程会进入等待状态中。当写者线程在写文件时,读者线程也会排队等待,说明读者和写者已经完成了同步。
本系列通过经典线程同步问题来列举线程同步手段的关键段、事件、互斥量、信号量,并作对这四种方法进行了总结。然后又通过二个著名的线程同步实例——生产者消费者问题和读者写者问题来强化对多线程同步互斥的理解与运用。希望读者们能够熟练掌握,从而在笔试面试中能够顺利的“秒杀”多线程的相关试题,获得自己满意的offer。
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7596034
分享到:
相关推荐
《秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据》 http://blog.csdn.net/morewindows/article/details/8646902 配套程序 在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥...
在多线程编程中,"读者-写者问题"是一个经典的并发控制问题,它涉及到如何在多个线程之间共享资源,使得多个读者可以同时访问资源(读操作),但当有写者时,所有读者和写者都必须被阻止,以确保数据的一致性。...
用java实现多线程并发中的读者与写者问题,能够实现多线程对临界资源的同步有序访问。 具体实现为: 给定一个队列A[1-10][1-100000]、元素编号1-10,其中每个元素包含10万个随机数。创建若干个线程,各循环100次;...
操作系统中的读者写者问题是经典的问题之一,主要涉及并发控制和多线程编程。在这个实验中,我们使用C++编程语言,结合Microsoft Foundation Classes (MFC)库来解决这个问题。MFC是一个面向对象的C++库,它为Windows...
有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求:①允许多...
用多线程同步方法解决读者写者问题(Reader-Writer Problem) ,设有20个连续的存储单元,写入/读出的数据项设定为1~20这20个字符。 要求; (1) 每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前...
操作系统的实验 用多线程来实现 读者写者问题
用多线程同步方法解决读者写者问,目的: 通过研究Linux的线程机制和信号量实现读者写者问题 (Reader-Writer Problem )的并发控制。 说明: 设有20个连续的存储单元,写入/读出的数据项设定为1~20这20个字符。
本文通过对一个简单的多线程程序的分析,介绍了如何在Windows环境中使用`CreateThread`函数创建线程,并简要探讨了生产者-消费者模式和读者写者问题。在实际开发中,还需要深入研究多线程同步机制,以确保程序的稳定...
在Windows下实现多线程读者写者间的优先竞争及公平竞争
在操作系统领域,读者写者问题是经典的并发控制问题,它涉及到多个读者和一个写者共享数据资源的情况。在读者写者问题中,多个读者可以同时访问数据,而写者独占资源进行修改。为了保证数据的一致性,我们需要设计一...
初学者写的java版线程读者优先写者优先问题,欢迎各位大神指点~~
请用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者优先:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。 写者优先:如果一个读者申请进行读操作时已有另一写...
读者写者问题是一个经典的多线程同步问题,它在计算机科学和编程中具有重要的理论和实践价值。在C++环境中,解决这个问题通常涉及到线程同步和互斥锁等概念。以下是对该问题的详细解释: 读者写者问题的核心是允许...
读者写者问题(Reader-Writer Problem)是一种经典的多线程同步问题,主要关注如何在多个进程或线程间共享资源时保持数据一致性。这个问题的核心在于处理多个读者和一个或多个写者对同一资源的访问控制: - **读者*...
printf("\t\t*-----------读者写者问题------------*\n"); printf("\t\t* 1:读者优先算法 *\n"); printf("\t\t* 2:先到先服务算法 *\n"); printf("\t\t* 3:写者优先算法 *\n"); printf("\t\t* 4:退出 *\n...
在Windows操作系统中,"win32 读者写者问题"是指多线程编程中的一个经典同步问题。读者写者问题是这样一种场景:多个线程(读者)可以同时读取一个共享资源,而当有线程(写者)需要修改这个资源时,必须独占访问,...
其中,“读者-写者问题”(Reader-Writer Problem)是一个经典的多线程同步问题,它涉及到如何在多个并发进程之间有效地共享资源。本篇文章将围绕这一主题,详细探讨读者-写者问题的实现及其在操作系统课程设计中的...
读者写者问题是一种经典的多线程同步问题,源自操作系统领域,用于解决多个进程(或线程)对共享资源的访问冲突。在这个问题中,我们有两类用户:读者和写者。读者可以同时读取资源,而写者在写入时需要独占资源,...