极速赛车APP下载

(转)CEvent,CSemaphore,CCriticalSection,CMutex

电脑杂谈  发布时间:2019-09-24 03:04:29  来源:网络整理

layoutsubviews 调用2次_ccriticalsection 使用_ccriticalsection 调用 2次

一、用CEvent实现线程同步

事件对象(Event)是最简单的同步对象,它包含有信号极速赛车APP下载和无信号两种状况。程访问某一资源之前,也许应该期待某一事件的出现,这时用事件对象最合适。例如,只有在通信端口缓冲区收到数据后,监视线程才被激活。MFC中,CEvent类提供了对事件的支持。CEvent对象有两种类别:人工事件和手动事件。对于自动事件,当其获取信号后,就会传递下一个可用的线程。一个自动CEvent对象在被大约一个线程释放后会手动返回到无信号状况;而人工事件对象获取信号后,释放所有可借助线程,直到读取成员变量ReSetEvent()将其设定为无信号状况时为止。

极速赛车APP下载在创建CEvent对象时,默认创建的是自动事件

CEvent类的构造函数原型如下:

CEvent(BOOL bInitia11y0wn=FALSE,//若bInitiallyOwn为TRUE,则使CMultilock类对象和CSingleLock类对象的线程可用;否则,要访问资源的轮询必须等待。该参数的默认值为FALSEo

BOOL bManualReset = FALSE,//选定要建立的CEvent对象是属于手工事件还是自动事件。为TRUE,则为手工事件;否则为手动事件。该参数默认值为FALSE o

LPCTSTR lpszName=NULL,//选定要建立的事件对象的名,如果该事件对象将跨进程使用,则此参数不能为NULL。如果该参数和一个已经存在的CEvent对象同样,则该构造函数返回一个对这个已存在对象的引用;如果参数和一个已存在的非CEvent类的同步对象(如CMutex )相同,则对象创建失败。

ccriticalsection 使用_layoutsubviews 调用2次_ccriticalsection 调用 2次

LPSECURITY ATTRIBUTES lpsaAttribute=NULL)//指定要建立对象的安全属性,一般置为NULL o

在事件对象建成后,可以读取其成员变量来改变其状况。CEvent类的几个重要的成员函数

SetEvent:将CEvent类对象的状况设定为有信号状态ccriticalsection 调用 2次极速赛车APP下载,并且传递所有期待的线程;如果该事件是人工事件,则CEvent类对象维持为有信号状况,直到读取成员变量ResetEvent将其再次设为无信号状况时为止,这样该事件就可以释放多个线程;如果CEvent类对象为自动事件,则在SetEvent将事件设定为有信号状况后,CEvent类对象由平台自动重置为无信号状况,除非一个线程被释放

ResetEvent:该变量将事件的状况设定为无信号状态,并维持该状况直到SetEvent被调用时为止。由于手动事件是由平台自动重置,故自动事件不需要调用该变量

PulseEnent:发送一个事件脉冲,该变量完成一系列操作后才返回。对于自动事件,PulseEvent将事件设定为有信号状况,等待一个线程被释放,将事件重置为无信号状况,然后PulseEvent返回;对于人工事件,则将期待该事件的所有线程被释放,事件被自动重置为无信号状况,然后PulseEvent返回

一个CEvent对象程中被建立后,自动进入无信号状况,但在另一个线程中可以读取API函数WaitForSingleObject来监视其状况

二、CCriticalSection类实现线程同步

layoutsubviews 调用2次_ccriticalsection 调用 2次_ccriticalsection 使用

当多个线程访问一个独占性共享资源时,可以使用Critical Section(临界区)对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的轮询可以访问被保护出来的资源或代码段,其他希望处于临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。因此,任一时刻,只有一个线程可以拥有临界区对象,而只有拥有临界区对象的轮询才可以访问受保护的数据。

MFC的CCriticalSection类提供了对临界区对象的支持,其用法也非常简洁,有两种用法。

1.单独使用CCriticalSection对象

1)定义CCriticalSection类的一个全局对象,以使各个线程均能访问,例如:CCriticalSection criticalsection;//CCriticalSection类的构造函数只有一种形式,即不带任何参数

2)在访问必须保护的资源或代码之前,调用CCriticalSection类的成员变量Lock获得临界区对象。代码如下:critical section.Lock();

如果这时没有其他线程占有临界区对象,则读取Lock函数的轮询获取临界区;否则,线程已经挂起,并放人到一个系统队列中期待,直到当前拥有临界区的线程释放了临界区时为止。

3)访问临界区完毕后ccriticalsection 调用 2次,使用CCriticalSection的成员变量Unlock来释放临界区。代码如下:critical section.Unlock()

layoutsubviews 调用2次_ccriticalsection 调用 2次_ccriticalsection 使用

2。与同步辅助类CSingleLock或CMutiLock一起使用

下面以类CSingleLock为例,简单说明使用方法:

1)定义CCriticalSection类的一个全局对象,格式如下:CCriticalSection critical_section;

2)在访问必须保护的资源之前,定义CSingleLock类的一个变量,并将critical_ section的地址传送给构造函数:CSingleLock singlelock(&critical_ section):

3)使用CSingleLock类的成员函数LOCk请求获取临界区。代码如下:singlelock。Lock();如果临界区已经被其它线程占用,则本线程挂起,等待临界区被释放。获得临界区对象后返回。

4)本线程中访问临界区中的共享资源后,调用CSingleLock类的成员变量Unlock来释放临界区:singlelock.Unlock();

三、CSemaphore类实现线程同步

使用信号量对象(Semaphore)也可以推动线程同步。信号量对象维护一个从0开始的计数,在计数值小于0时对象是有信号的,而在计数值为0时则是无信号的。通过使用信号量对象,可以限制对共享资源进行访问的线程总量。MFC中,CSemaphore类实现了对信号量对象的封装。具体来讲,CSemaphore的一个对象保存了对当前访问某一指定资源的轮询的计数值,该计数值是当前还可以使用该资源的线程的数量。如果这个计数超过了零,则所有对这个CSemaphore类对象所控制的资源的访问尝试都被放在到一个队列中期待,直到超时或计数值不为零时为止。当一个线程访问了被保护的资源时,计数值减1;一个线程完成了对被控共享资源的访问时,计数值增to在CSemaphore类对象的构造函数中可以选定控制的资源可以同时接受访问的最大线程数,

构造函数原型如下。

CSemaphore

(LONG lInitialCount=1,//信号量对象的初始计数值,决定了在信号量对象建成后,能同时访问其中资源的最大线程数量。必须不高于0,不小于lMaxCount

LONG lMaxCount=1,//信号量对象计数值的最大值,该参数决定了同一时刻可访问由信号量保护的资源的轮询最大数目

LPCTSTR pstrName=NULL,//指向要构建的信号量名字。如果该信号量跨进程使用,则该参数不能为空

LPSECURITY_ATTRIBUTES lpsaAttributes=NULL);

CSemaphore类通常也与线程同步辅助类CSingleLock或CMutiLock类结合使用。用法与CCriticalSection类似

转自


本文来自电脑杂谈,转载请注明本文网址:
http://www.0531mai.com/a/jisuanjixue/article-123936-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    极速赛车双面盘 极速赛车手机官网 极速赛车APP下载 极速赛车手机官网 极速赛车手机版下载 极速赛车双面盘 极速赛车手机版下载 极速赛车双面盘 极速赛车APP下载 极速赛车APP