/************************************************************************
** Critical Section 临界区
** 这是一种防止多个线程同时执行一个特定代码节的机制。
** 临界区是一种轻量级机制,在某一时间内只允许一个线程执行某个给定代码段。
** 通常在修改全局数据(如集合类)时会使用临界区。Event、Mutex和Semaphore也用于多线程同步,但临界区与它们不同,
** 它并不总是执行向内核模式的控制转换,这一转换成本昂贵。稍后将会看到,要获得一个未占用临界区,
** 事实上只需要对内存做出很少的修改,其速度非常快。只有在尝试获得已占用临界区时,它才会跳至内核模式。
** 这一轻量级特性的缺点在于临界区只能用于对同一进程内的线程进行同步。
** 主要函数有四个:
** 1.InitializeCriticalSection
** 2.DeleteCriticalSection
** 3.EnterCriticalSection
** 4.LeaveCriticalSection
** 注意事项:
** 1.需防止长时间锁定一个代码区
** 2.避免dangling critical section ?
** 参考资料
** 《解开 Windows 下的临界区中的代码死锁》:
** http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/ousCriticalSections.mspx?mfr=true
************************************************************************/
#include <iostream>
#include <windows.h>
using namespace std;
CRITICAL_SECTION cs;
static int g_AddValue = 0;
DWORD WINAPI FirstThread( LPVOID lParam )
{
//EnterCriticalSection(&cs);
for ( int i = 0; i < 10; i++ )
{
EnterCriticalSection(&cs);
g_AddValue++;
cout << "FirstThread : " << g_AddValue << endl;
LeaveCriticalSection(&cs);
}
//LeaveCriticalSection(&cs);
return 0;
}
DWORD WINAPI SecondThread( LPVOID lParam )
{
//EnterCriticalSection(&cs);
for ( int i = 0; i < 10; i++ )
{
EnterCriticalSection(&cs);
g_AddValue++;
cout << "SecondThread : " << g_AddValue << endl;
LeaveCriticalSection(&cs);
}
//LeaveCriticalSection(&cs);
return 0;
}
int main()
{
InitializeCriticalSection( &cs );
HANDLE hThread[2] = {0};
hThread[0] = CreateThread( NULL, 0, FirstThread, 0, 0, 0 );
hThread[1] = CreateThread( NULL, 0, SecondThread, 0, 0, 0 );
WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );
DeleteCriticalSection( &cs );
cout << endl;
cout << "*****Finish*****" << endl;
return 0;
}