hi man

博客园 首页 新随笔 联系 订阅 管理

下面我就用Lock, Unlock分别代替EnterCriticalSection(),LeaveCriticalSection()吧. 这样说起来方便.

// 线程1
threadfunc1()
{
  Lock();
  // 代码1
  Unlock();
}

// 线程2
threadfunc2()
{
  Lock();
  // 代码2
  Unlock();
}

当 线程1 执行了 代码1 时,先Lock(); 这时如果 线程2 被唤醒, 遇到Lock()的时候会根据 CRITICAL_SECTION cs 来是否可以使用 代码2。因 cs 已经被 线程1 所占领。所以第二个线程的Lock()语句将不会返回,而是处于挂起状态,直到第一个线程执行了Unlock(), 第二个线程的Lock()语句才会返回并且继续执行下面的操作。

虽然临界区同步速度很快,但只能用来同步本进程内的线程,而不可用来同步多个进程中的线程

简单地说,对于同一个 CRITICAL_SECTION,当一个线程执行了EnterCriticalSection而没有执行LeaveCriticalSection的时候,其它任何一个线程都无法完全执行EnterCriticalSection而不得不处于等待状态

我今天就犯了个严重的错误,代码段如下:

void CDataMngr::AddData(unsigned int uData)
{
Lock();
if ( uData > 0 ){
return;
}
Unlock();
}

看出错误来了吧。在return 之前应该有Unlock(); 写代码的时候一定要细心,不管手头的活再多,脑残策划吹的再急,也要稳一点。

posted on 2011-06-16 23:07  KuPig  阅读(224)  评论(0编辑  收藏  举报