很多人对CRITICAL_SECTION的理解是错误的,认为CRITICAL_SECTION是锁定了资源,其实,CRITICAL_SECTION是不能够“锁定”资源的,它能够完成的功能,是同步不同线程的代码段。简单说,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一个线程占用了它。而此时,并没有任何资源被“锁定”。不管什么资源,其它线程都还是可以访问的(当然,执行的结果可能是错误的)。只不过,在这个线程尚未执行LeaveCriticalSection之前,其它线程碰到EnterCritialSection语句的话,就会处于等待状态,相当于线程被挂起了。 这种情况下,就起到了保护共享资源的作用。
WinCE下临界区CriticalSection使用
临界区(CriticalSection)主要用来线程的同步,使用临界区相对比较简单;其使用的系统API如下:
一、InitializeCriticalSection
初始化
VOID InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection);
本函数初始化临界区资源,在使用前必需调用函数
二、EnterCriticalSection
占用临界区
VOID EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection );
在你需要同步的代码前调用本函数来占用临界区
三、TryEnterCriticalSection
尝试性占用临界区
BOOL TryEnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection );
尝试性地占用临界区,如果此时临界区没被占用,则占用临界区并返回非0值,否则反回0值
四、LeaveCriticalSection
释放对临界区的占用
VOID LeaveCriticalSection ( LPCRITICAL_SECTION lpCriticalSection );
在你占用临界区并执行完同步代码之后必需调用本函数来释放对临界区的占用
五、DeleteCriticalSection
释放临界区资源
VOID DeleteCriticalSection( LPCRITICAL_SECTION lpCriticalSection );
在你的程序退出时或在不再使用临界区是调用本函数来释放临界区资源
使用例子如下:
1.初始化
//初始化
CRITICAL_SECTION tCri;
InitializeCriticalSection( &tCri );
2.占用与释放占用
//占用与释放占用
EnterCriticalSection( &tCri );
//此处为你需要同步的代码
……..
LeaveCriticalSection( &tCri );
当然此段代码也可以写成如下的样子
if (TryEnterCriticalSection( &tCri )!=0)
{
//此处为你需要同步的代码
……..
LeaveCriticalSection( &tCri );
}
当然我们知道TryEnterCriticalSection是不会阻塞你的程序的执行的
3.释放临界区资源
DeleteCriticalSection( &tCri );
转自:http://www.a3gs.com/BookViews.asp?InfoID=2545&classID=800