社区
非技术类
帖子详情
进程与临界资源问题
mmp
2004-04-30 11:01:18
哪位高手有关于这个问题的例子程序?
请发到我的邮箱,谢谢!
mzhwaae@sohu.com
...全文
140
4
打赏
收藏
进程与临界资源问题
哪位高手有关于这个问题的例子程序? 请发到我的邮箱,谢谢! mzhwaae@sohu.com
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mmp
2004-05-04
打赏
举报
回复
大家帮一下啊
mmp
2004-05-02
打赏
举报
回复
谢谢enoloo(行者无疆) 的精彩答复,有更详细的程序吗?
我是初学者,感到无法下手。
谢谢!
enoloo
2004-04-30
打赏
举报
回复
CSDN - 文档中心 - Visual C++
标题 Windwos下的线程互斥和同步 coppermine(原作)
关键字 Windows、线程、互斥、同步
Windwos下的线程互斥和同步
关键字: Windows、线程、互斥、同步
摘要:分析了“互斥”与“同步”在概念上的差异,简单介绍了Windows平台下的互斥、同步机制,详细讨论了生产者-消费者模型及其变形,以及容易出错的方面。
概述
网络多媒体应用系统同时包括网络传输、媒体采集和显示、媒体数据编解码、人机接口等多个紧密联系而又相对独立的组成部分,各部分之间需要并行协作才能正常运行,因此大量采用了多线程的运行模式。多线程模式对资源的访问提出了特殊要求。本文分析了线程“互斥”与“同步”在概念上的差异,简单介绍了Windows平台下的互斥、同步机制,详细讨论了生产者-消费者模型及其变形,以及容易出错的方面。
互斥与同步
互斥和同步是两个紧密相关而又容易混淆的概念。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。
Windows下的互斥同步机制
Windows下提供了多种内核对象实现线程、进程间的同步和互斥,常用的有:
关键节(Critical Section):关键节不是内核对象,在用户态实现了同一进程中线程的互斥。由于使用时不需要从用户态切换到核心态,所以速度很快(X86系统上约为20个指令周期),但其缺点是不能跨进程同步,同时不能指定阻塞时的等待时间,只能无限等待。
互斥体:(Mutex):互斥体实现了和关键节类似的互斥功能,但区别在于:互斥体是内核对象,可以实现跨进程互斥,但需要在用户态和核心态之间切换,速度比关键节慢得多(X86系统上约为600个指令周期),同时可以指定阻塞时的等待时间。
事件(Event):事件也是内核对象,具有“信号态”和“无信号态”两种状态。当某一线程等待一个事件时,如果事件为信号态,将继续执行,如果事件为无信号态,那么线程被阻塞。线程能够指定阻塞时的等待时间。
信号量(Semaphore):信号量是一个资源计数器,当某线程获取某信号量时,信号量计数首先减1,如果计数小于0,那么该线程被阻塞;当某县城释放某信号量时,信号量计数首先加1,如果计数小于或等与0,那么唤醒某被阻塞的线程并执行之。对信号量的总结如下:
1. 如果计数器m大于0,表示还有m个资源可以访问,此时信号量线程等待队列中没有线程被阻塞,新的线程访问资源也不会被阻塞;
2. 如果计数器m等与0,表示没有资源可以访问,此时信号量线程等待队列中没有线程被阻塞,但新的线程访问资源会被阻塞;
3. 如果计数器m小于0,表示没有资源可以访问,此时信号量线程等待队列中有abs(m)个线程被阻塞,新的线程访问资源会被阻塞;
信号量常被用于保证对多个资源进行同步访问。
生产者-消费者模型
生产者-消费者模型是指:
1. 生产者进行生产将物品放入仓库,同一时间只能有一个生产者将物品放入仓库,如果仓库满,生产者等待。
2. 消费者从仓库中取出物品,同一时间只能有一个消费者取出物品,如果仓库空,消费者等待;
3. 生产者将物品放入仓库时消费者不能同时取;
4. 消费者取物品时生产者不能放入物品;
总之,就是生产者群体或消费者群体内部是互斥的,两个群体之间是同步的。
当只有一个生产者、消费者时,由于同一群体内部不需要互斥,所以只需在群体之间实 现同步即可。例如可以使用两个Event/CriticalSection/Mutex/Semaphore实现同步;
如果有多个生产者和消费者,那么情况会复杂些,需要一个Event/CriticalSection/Mutex实现线程之间的互斥,需要两个Semaphore实现两个线程群体间的同步。一个例子如下:
HANDLE m_S_Producer; // Semaphore
HANDLE m_S_Consumer; // Semaphore
HANDLE m_E_Queue; // Event
// 假设仓库最多容纳M个物品,开始仓库为空
m_S_Producer = CreateSemaphore(NULL, M, M, NULL); //初始计数为M
m_S_Consumer = CreateSemaphore(NULL, 0, M, NULL); //初始计数为0
m_E_Queue = CreateEvent(NULL, FALSE, TRUE, NULL); //自动类型,初始状态为信号态
生产者
if (WaitForSingleObject(m_S_Producer, WaitTime) == WAIT_OBJECT_0)
{
if (WaitForSingleObject(m_E_Queue, WaitTime) == WAIT_OBJECT_0)
{
// OK now, put product
// relase comsumer’s semaphore
ReleaseSemaphore(m_S_Consumer, 1, NULL);
// set event to signal
SetEvent(m_E_Queue);
return TRUE;
}
else // wait event time out
{
// not put product so release producer
ReleaseSemaphore(m_S_Producer, 1, NULL);
SetEvent(m_E_Queue);
return FALSE;
}
}
else // wait semaphore time out
{
return FALSE;
}
消费者
if (WaitForSingleObject(m_S_Consumer, WaitTime) == WAIT_OBJECT_0)
{
if (WaitForSingleObject(m_E_Queue, WaitTime) == WAIT_OBJECT_0)
{
// OK now, Get product then
// releasee productor’s semaphore
ReleaseSemaphore(m_S_Producer, 1, NULL);
// set event to signal
SetEvent(m_E_Queue);
return TRUE;
}
else // wait event time out
{
// not get product so release Consumer
ReleaseSemaphore(m_S_Consumer, 1, NULL);
SetEvent(m_E_Queue);
return FALSE;
}
}
else // wait semaphore time out
{
return FALSE;
}
特别需要注意的是,在该模型中,对互斥量(本例为m_E_Queue)的等待必须放在第二个等待位置,否则可能将造成线程死锁。考虑这样的情况:仓库已满,没有任何线程访问。某一时刻,生产者放入物品,首先等待m_E_Queue并通过,且将m_E_Queue置于无信号态,然后等待m_S_Produce时被阻塞。这时某一消费者欲取物品,无论在什么情况下,都将在等待m_E_Queue时被阻塞,从而相互等待造成死锁。在释放同步对象时则位置不受限制。
多个生产者一个消费者
这时一种常用的变形。如果仓库是一个队列(先进先出),此时消费者内部将不需要互斥。
消费者
if (WaitForSingleObject(m_S_Consumer, WaitTime) == WAIT_OBJECT_0)
{
// OK now, Get product then
// releasee productor’s semaphore
ReleaseSemaphore(m_S_Producer, 1, NULL);
return TRUE;
}
else // wait semaphore time out
{
return FALSE;
}
此时可能出现消费者、生产者同时访问资源的情况,但生产者群体和消费者群体之间的同步机制,以及队列的先进先出机制将保证即使消费者、生产者同时访问资源,也不会发生冲突。
多个消费者一个生产者的情况类似。
mmp
2004-04-30
打赏
举报
回复
各位大哥帮帮忙啊,简单点的进程创建与临界资源的互斥问题,例如生产者与消费者问题,读者写者问题,哲学家就馋。临界资源也不要很大。1就行。
临界资源
的同步与互斥,区分
临界资源
与临界区,二义性分析
本文探讨了在多
进程
环境中,
临界资源
访问与
进程
同步的重要性。解释了互斥与同步的概念,如何防止数据二义性及确保
临界资源
合理访问。通过实例说明了操作系统调度与
临界资源
访问可能导致的
问题
。
操作系统_
进程
管理_
进程
的控制与同步
本文详细阐述了
进程
控制的基本概念,包括
进程
的创建、
进程
间的互斥与同步,
临界资源
和临界区的管理,以及同步机制的原则。通过信号量与P/V操作的讲解,深入理解
进程
间的直接制约关系,并以生产者与消费者
问题
为例,展示了如何运用信号量解决
进程
同步与互斥的
问题
。
操作系统(9)
进程
同步
本文围绕操作系统中的
进程
同步展开,介绍了其基本概念,包括
进程
同步机制、
临界资源
和临界区。阐述了
进程
同步与互斥的关系,说明了
进程
同步机制的四个基本原则。还介绍了软件和硬件同步方法、主要同步工具,以及经典同步
问题
的解决方案,以确保
进程
正确高效访问共享资源。
2.3.1
进程
的同步与互斥
本文深入探讨了多道程序环境下
进程
同步与互斥的概念,解释了如何通过
进程
同步解决异步
问题
,确保计算的正确性;并通过实例阐述了
进程
互斥在
临界资源
访问中的作用,强调了遵循访问准则的重要性。
进程
同步、
进程
互斥
本文深入探讨了
进程
同步与互斥的概念。
进程
同步确保了
进程
执行的顺序,解决了并发执行中的异步
问题
,而
进程
互斥关注的是
临界资源
的访问,保证在同一时刻只有一个
进程
能访问。通过临界区、进入区和退出区的管理,遵循空闲让进、忙则等待、有限等待和让权等待的原则,实现对
临界资源
的安全访问。
非技术类
1,663
社区成员
58,948
社区内容
发帖
与我相关
我的任务
非技术类
VC/MFC 非技术类
复制链接
扫一扫
分享
社区描述
VC/MFC 非技术类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章