社区
非技术类
帖子详情
进程与临界资源问题
mmp
2004-04-30 11:01:18
哪位高手有关于这个问题的例子程序?
请发到我的邮箱,谢谢!
mzhwaae@sohu.com
...全文
118
4
打赏
收藏
进程与临界资源问题
哪位高手有关于这个问题的例子程序? 请发到我的邮箱,谢谢! mzhwaae@sohu.com
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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就行。
编程模拟多
进程
共享
临界资源
要求系统由两部分组成:用户
进程
与管理
进程
; (2)管理
进程
要控制设计相应的临界区,并实现临界区的四大准则:空闲让进、忙则等待、有限等待、让权等待; (3)要求用户
进程
的申请是随机且循环的; (4)在消息队列...
进程
对
临界资源
的互斥访问
临界资源
与临界区
临界资源
(critical resource):一次只能供一个
进程
使用的资源。 如:硬件有打印机等,软件有变量,磁盘文件(写入的时候)。 临界区(critical section):把
进程
中访问
临界资源
的那段代码成为...
什么是
临界资源
和临界区
1.
临界资源
临界资源
是一次仅允许一个
进程
使用的共享资源。各
进程
采取互斥的方式,实现共享的资源称作临界... 每个
进程
中访问
临界资源
的那段代码称为临界区(criticalsection),每次只允许一个
进程
进入临界区,
多线程中的
临界资源
问题
一、多线程中的
临界资源
问题
临界资源
临界资源
是一次仅允许一个
进程
使用的共享资源。各
进程
采取互斥的方式,实现共享的资源称作
临界资源
。属于
临界资源
的硬件有:打印机,磁带机等;软件有消息队列、变量、数组、...
什么是
临界资源
计算机网络,什么是
临界资源
?什么是临界区?
匿名网友:参考答案:
临界资源
是指一次仅允许一个
进程
访问的资源.临界区是指每个
进程
中访问
临界资源
的那段程序代码.试题难度:★★☆参考解析: 暂无解析匿名网友:临界区:每个
进程
中访问
临界资源
的那段程序叫做临界...
非技术类
1,658
社区成员
58,949
社区内容
发帖
与我相关
我的任务
非技术类
VC/MFC 非技术类
复制链接
扫一扫
分享
社区描述
VC/MFC 非技术类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章