使用方法:
// 临界区
CRITICAL_SECTION m_cs;
// 线程函数1
ThreadFunction1()
{
EnterCriticalSection(&m_cs);
// do something
LeaveCriticalSection(&m_cs);
}
// 线程函数1
ThreadFunction2()
{
EnterCriticalSection(&m_cs);
/ do something
LeaveCriticalSection(&m_cs);
}
// 简单说明
在ThreadFunction1()中, 在调用了EnterCriticalSection(&m_cs), 而在调用LeaveCriticalSection(&m_cs)前,假设ThreadFunction2()调用到EnterCriticalSection(&m_cs), 此时hreadFunction2()发现了有别的地方已经EnterCriticalSection(&m_cs)了, 就会挂起, 知道ThreadFunction1()调用了LeaveCriticalSection(&m_cs);后, 线程ThreadFunction2()才被唤醒。
// 相关函数
//初始化临界区, 可以在线程创建函数中执行 参数是out, 相当于创建临界区
InitializeCriticalSection (&csMyCriticalSection);
//进入临界区
EnterCriticalSection (& m_cs);
//退出临界区
LeaveCriticalSection (& m_cs);
//删除临界区
DeleteCriticalSection(& m_cs);
// 引用:
http://blog.youkuaiyun.com/hbyh/archive/2007/08/30/1765953.aspx
The InitializeCriticalSectionAndSpinCount function initializes a critical section object and sets the spin count for the critical section.
BOOL InitializeCriticalSectionAndSpinCount(
LPCRITICAL_SECTION lpCriticalSection,
// pointer to critical section
DWORD dwSpinCount // spin count for critical section
);
当线程试图进入另一个线程拥有的关键代码段时,调用线程就立即被置于等待状态。这意
SetCriticalSectionSpinCount
The SetCriticalSectionSpinCount function sets the spin count for the specified critical section.
DWORD SetCriticalSectionSpinCount( LPCRITICAL_SECTION lpCriticalSection, // pointer to critical section DWORD dwSpinCount // spin count for critical section );
味着该线程必须从用户方式转入内核方式(大约1 0 0 0个C P U周期)。这种转换是要付出很大代价的。因此, InitializeCriticalSectionAndSpinCount 的作用不同于InitializeCriticalSection 之处就在于设置了一个循环锁,不至于使线程立刻被置于等待状态而耗费大量的CPU周期,而在dwSpinCount后才转为内核方式进入等待状态。通常 dwSpinCount设为4000较为合适 。