有全局变量
CCriticalSection ccr;        
int tn;然后在一线程A中
        ccr.Lock();
tn = 1;
for(tn = 0;tn<20;tn++)
{
Sleep(1000);
}
ccr.Unlock();在另一线程B中有        int k=-3;
while(k<tn)
{

nn.Format(_T("%d"),tn);
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_GETCRI,nn);
Sleep(1000);
k++;
       }
然后先启动线程A,2秒后启动线程B
从代码上理解,应该是A被启动后,将tn锁住,然后过一秒就+1,20秒后解锁,而在加到20前,B应该是不能读到tn的吧?!
可从运行情况来看,由B控制的编辑框却显示它在A运作的时间里依然可以读到tn,并很自然地按条件每秒更新了,这是怎么回事?
     

解决方案 »

  1.   

    锁住的是ccr,不是tn。在线程B中先执行ccr.Lock(),最后执行ccr.Unlock(),这样B在执行ccr.Lock时才会等待。
      

  2.   

    Lock锁定的是CCriticalSection对象,CCriticalSection对象只能被一个线程Lock。如果某个CCriticalSection对象被A线程Lock后,再有B线程Lock,则B线程会停下来,直到A线程Unlock后,B线程才继续执行(此时对象被B线程Lock了)。通过这样的方式实现线程间代码互斥。
      

  3.   

    是的,对于资源访问都需要Lock,UnLock