社区
非技术类
帖子详情
进程与临界资源问题
mmp
2004-04-30 11:01:18
哪位高手有关于这个问题的例子程序?
请发到我的邮箱,谢谢!
mzhwaae@sohu.com
...全文
129
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就行。
编程模拟多
进程
共享
临界资源
要求系统由两部分组成:用户
进程
与管理
进程
; (2)管理
进程
要控制设计相应的临界区,并实现临界区的四大准则:空闲让进、忙则等待、有限等待、让权等待; (3)要求用户
进程
的申请是随机且循环的; (4)在消息队列中事先约定好
进程
写入的信息类型; (5)用户
进程
在临界区执行的时间要是随机的,且执行完毕后要向管理
进程
发出申请退出的信号;
进程
对
临界资源
的互斥访问
临界资源
与临界区
临界资源
(critical resource):一次只能供一个
进程
使用的资源。 如:硬件有打印机等,软件有变量,磁盘文件(写入的时候)。 临界区(critical section):把
进程
中访问
临界资源
的那段代码成为临界区。 为了实现
临界资源
的互斥访问,只要做到
进程
互斥地进去自己的临界区,便可以实现
进程
对
临界资源
的互斥访问。 同步机制 为实现各
进程
互质地访...
什么是
临界资源
和临界区
1.
临界资源
临界资源
是一次仅允许一个
进程
使用的共享资源。各
进程
采取互斥的方式,实现共享的资源称作
临界资源
。属于
临界资源
的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸
进程
间采取互斥方式,实现对这种资源的共享。 2.临界区: 每个
进程
中访问
临界资源
的那段代码称为临界区(criticalsection),每次只允许一个
进程
进入临界区,
多线程中的
临界资源
问题
一、多线程中的
临界资源
问题
临界资源
临界资源
是一次仅允许一个
进程
使用的共享资源。各
进程
采取互斥的方式,实现共享的资源称作
临界资源
。属于
临界资源
的硬件有:打印机,磁带机等;软件有消息队列、变量、数组、缓冲区等。诸
进程
间采取互斥方式,实现对这种资源的共享。 临界区 每个
进程
中访问
临界资源
的那段代码称为临界区,每次只允许一个
进程
进入临界区,进入后,不允许其他
进程
进入。不论是硬件
临界资源
还是软件
临界资源
...
操作系统——
临界资源
和临界区
操作系统——
临界资源
和临界区 1、
临界资源
概念:一次仅允许一个
进程
使用的共享资源。 2、临界区 概念:每个
进程
中访问
临界资源
的那段程序称之为临界区。 临界区不是内核对象,而是系统提供的一种数据结构,程序中可以声明一个该类型的变量,之后用它来实现对资源的互斥访问。当欲访问某一
临界资源
时,先将该临界区加锁(若临界区不空闲则等待),用完该资源后,将临界区释放。 3、
进程
进入临界区的调度原则 ① 如果有若干
进程
请求进入空闲的临界区(空闲即0
进程
访问),一次仅允许一个
进程
进入。 ② 任何时候,处于临界区内
非技术类
1,662
社区成员
58,948
社区内容
发帖
与我相关
我的任务
非技术类
VC/MFC 非技术类
复制链接
扫一扫
分享
社区描述
VC/MFC 非技术类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章