CCriticalSection类是由Microsoft Foundation Class(MFC)库提供的一个类,它暗示一个临界区,即一种同步工具,它只答允一个线程一次会见一个资源或一个代码段。CCriticalSection类与其他同步类,如CSemaphore、CMutex和CEvent,差异的是,它更快、更简朴、更轻量。它也更适条约步同一个历程内的线程,而不是跨历程的线程。
一个临界区工具可以声明为一个全局变量、一个类的静态成员或一个栈上的局部变量。在利用一个临界区工具之前,必需通过挪用它的结构函数CCriticalSection::CCriticalSection来初始化它。在利用完之后,必需通过挪用它的析构函数CCriticalSection::~CCriticalSection来删除它。可能,也可以利用Win32函数InitializeCriticalSectionAndSpinCount和DeleteCriticalSection来初始化和删除一个临界区工具。
要进入一个临界区,一个线程必需挪用CCriticalSection::Lock或EnterCriticalSection函数。假如临界区是可用的,那么线程就会得到它,并继承会见受掩护的资源或代码段。假如临界区已经被另一个线程拥有,那么线程就会被阻塞并期待,直到另一个线程释放它。要释放一个临界区,一个线程必需挪用CCriticalSection::Unlock或LeaveCriticalSection函数。要确保每次挪用Lock或EnterCriticalSection都有相应的挪用Unlock或LeaveCriticalSection,不然临界区将保持锁定并导致死锁。
利用临界区时的一个常见错误是,在产生异常或提前返回时健忘解锁它们。为了制止这个问题,可以利用CSingleLock类,它是一个同步会见类,它包装了一个CCriticalSection工具。一个CSingleLock工具可以在栈上建设,并在其结构函数中通报一个指向CCriticalSection工具的指针。然后,可以挪用它的Lock和Unlock要领来进入和分开临界区。利用CSingleLock的利益是,它会在分开浸染域时自动解锁临界区,纵然产生异常或函数提前返回。
利用CSingleLock的另一个利益是,它答允对进入临界区举办按时期待。默认环境下,CCriticalSection::Lock和EnterCriticalSection会无限期地阻塞,直惠临界区可用。然而,CSingleLock::Lock可以接管一个可选参数,指定超时时间(以毫秒为单元)。假如在指按时间内临界区不行用,Lock要领将返回FALSE,而且线程可以执行其他任务或稍后重试。
CCriticalSection类是MFC应用措施中同步线程的有用类。它利用简朴、效率高、机动性强。它可以防备多个线程会见共享资源或代码段时产生数据损坏和竞争条件。然而,也要留意它的范围性和陷阱,,譬喻死锁、饥饿、递归和优先级反转。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。