[MFC]MFC同步类总结

MFC同步类

  • CCriticalSection临界区:在用户模式工作(遇到加锁等待时会进入内核模式),使用与保护线程间共享资源,一个线程可以多次Lock不会错。不支持在多进程之间工作。将一段代码置入临界区,只允许最多一个线程进入执行这段代码。一个临界区仅在创建它的进程中有效。
  • CMutex互斥量:在内核模式工作,除支持临界区的功能外,还可以为互斥量命名,以便在多进程中工作。互斥量比临界区耗资源。一个时刻至多只允许一个线程访问某资源,未被占用时处于有信号状态,可以实现对共享资源的互斥访问。
  • CEvent事件:在内核模式工作,适用于某一线程等待某事件发生才执行的场合。
  • CSemaphore信号量(信号灯):在内核模式工作,适用于允许特定个数的线程执行某任务。允许一定数目的线程访问某个共享资源,常用来控制访问共享资源的线程数量。

同步对象的适用场合

  • 1.如果某个线程必须等待某些事件发生后才能存取相应的资源,则用CEvent
  • 2.如果一个应用程序同时可以有多个线程存取相应资源,则用CSemaphore
  • 3.如果多个应用程序(多个线程)同时存取相应资源,则用CMutex,否则用CCriticalSection

等待类CSingleLock

一个CSingleLock类对象代表一种访问控制机制,这种机制用于控制在一个多线程程序中对一个资源的访问。为了使用同步类CSemaphoreCMutexCCriticalSectionCEvent所创建的同步对象,你必须创建一个CSingleLock或者CMultiLock对象来等待和释放这个同步对象。当你只需要每次等待一个对象时,则用CsingleLock,否则用CMultiLock

要使用一个CSingleLock对象,在被控制资源的类中的一个成员函数内部调用CSingleLock的构造函数。然后调用IsLock成员函数来确定这个资源是否可用。如果资源是可用的,则继续该成员函数的其余部分。

CSingleLock::CSingleLock( CSyncObject* pObject, BOOL bInitialLock = FALSE );
pObject	指向要被访问的同步对象。不能是NULL
bInitialLock	指示是否要在最初尝试访问所提供的对象

BOOL CSingleLock::IsLocked() 
返回值:如果对象被加锁则返回非零值;否则返回0。 此成员函数用来确定与CSingleLock对象相关的对象是否没有发信号(不能使用)。 

BOOL CSingleLock::Lock( DWORD dwTimeOut = INFINITE ); 
返回值:如果函数成功则返回非零值;否则返回0。 
参数:dwTimeOut	指定等待要被利用的同步对象的时间数量。如果是INFINITE,则Lock等待直到该对象在返回之前可用。
说明:此成员函数用来获取对由同步对象控制的资源的访问,这个访问要提供给CSingleLock构造函数。如果同步对象是可用的,Lock将成功返回,而且线程拥有了该对象。如果此同步对象是不可用的,则Lock将等待此同步对象在dwTimeOut参数指定的时间内变为可用。如果此同步对象在指定的时间内没有变为可用的,则Lock返回失败。
 
BOOL  CSingleLock::Unlock( );
BOOL  CSingleLock::Unlock( LONG lCount, LPLONG lPrevCount = NULL );
返回值:如果函数成功则返回非零值;否则返回0。
参数: lCount:要释放的访问数目。必须要大于0。如果指定的数量要导致对象的计数超过它的最大值,则计数不改变,并且函数返回FALSE。
lPrevCount:指向一个用来接收同步对象的先前计数的变量。如果是NULL,则不返回先前的计数。
说明:此成员函数用来释放由CSingleLock拥有的同步对象。由CSingleLock的析构函数类调用这个函数。如果你需要释放一个信号的多于一个的访问计数,可以使用Unlock的第二种形式,并指定要释放的访问数目。 

MFC中,具有等待功能的类CSingleLockCMultiLock封装了Win32中的等待函数WaitForSingleObject()WaitForMultipleObjects() 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页