多线程问题!
2。各位能否告知CMultiLock,CSingleLock,CSyncObject,CEvent,CMutex,CCriticalSection,CSemaphore
之间是什么关系,每个类都是干什么用的,怎么使用?(请详细说明,MSDN我看的头都大,还是不明白),
3.如果我要锁定某个临界变量num,使它仅供某个线程使用,不被其他线程干扰,
int num=0;
CCriticalSection cs;
CSingleLock sl(&cs);
UINT OnPro(LPVOID lp)
{
sl.Lock();
num=400;
Sleep(4000);
sl.UnLock();
PostMessage((HWND)lp, WM_THREADEND,0,0);
return 0;
}
void CCriticalDlg::OnButton1()
{
AfxBeginThread(OnPro,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
}
当该进程运行时,我为何还可以在别的进程中改变num的值?应该怎么锁定num?
问题点数:100、回复次数:4Top
1 楼singlerace(独行者)回复于 2000-11-30 00:21:00 得分 20
CCriticalSection cs应该定义为全局的吧。在别的线程访问num时也应该加锁:
sl.Lock();
// ...
sl.Unlock();Top
2 楼leer(白痴)回复于 2000-11-30 00:36:00 得分 20
第一个问题太大了,我还是来回答你第二个部题吧。
sl.Lock();
num=400;
Sleep(4000);
sl.UnLock();
这段代码的意思是说在sl.Lock()与sl.UnLoick()之间不允许对num进行修改。
只要调用了sl.UnLock()别的线程就可以进行修改了。如果你一定要试可以把sleep的时间
加长一些例如一分钟(60000)然后再做一下测试。Top
3 楼abentu()回复于 2000-11-30 08:47:00 得分 50
简单说,所谓的加锁,其实是一种约定,在访问敏感的共享资源时,首先要申请加锁,如果不成功,Lock函数不返回,线程也暂时失去被调度的权利,不被分配CPU时间,直到其它使用者调用Unlock,你的Lock函数才返回,线程才可重新被调度。如果有人不遵守协议,一切都白干Top
4 楼panda_w(好想睡啊!)回复于 2001-01-10 10:14:00 得分 10
第一个问题你还是看看相关的书籍吧。
对于第二个问题:
你的Sleep导致这个线程碑挂起,所以别的线程可以访问num变量了。
你可以使用Interlocked函数族来防止其它的线程访问num,
比如InterlockedIncrement((long*)&num);函数。Top




