请教一个关于线程执行的问题,看我理解的对不对?
有这样一段代码:
说明:所有的变量都以申明
........................代表一些代码
BOOL CAscend_SMSDlg::OnInitDialog()
{
.......................
hMutex = CreateMutex(NULL,FALSE,"MutexStop");
.......................
}
UINT RcvMsg(LPVOID)
{
...............................
Sleep(200);
while(true)
{
dwWaitResult = WaitForSingleObject(hMutex ,100);
switch(dwWaitResult)
{
case WAIT_OBJECT_0:
{
ReleaseMutex(hMutex);
AfxEndThread(1); return 0;
}
case WAIT_TIMEOUT:
{
.......................
if(没有错误)
{
A操作;
}
else
{
................
ReleaseMutex(hMutex);
AfxEndThread(1); return 0;
}
}
case WAIT_ABANDONED:
Sleep(1);
break ;
}
}
}
void CAscend_SMSDlg::OnBtnOpen()
{
........................
dwWaitResult = WaitForSingleObject(hMutex , INFINITE);
AfxBeginThread(RcvMsg,"" );
........................
}
初始化时创建一个信号灯,再OnBtnOpen()中dwWaitResult = WaitForSingleObject(hMutex , INFINITE);中使信号灯无效,其他线程无法访问,然后启动线程。
再UINT RcvMsg(LPVOID)中的dwWaitResult = WaitForSingleObject(hMutex ,100);本来信号灯就是无效的,等100ms后,信号灯还是无效,便执行WAIT_TIMEOUT:只要没有错误,便执行A操作。因为是死循环,便在等100ns,还是执行A操作,一直执行下去,也就是说信号灯不可能变为真。(当然我会再关闭窗口前,杀死线程)
现在有一疑问:
书上说把dwWaitResult = WaitForSingleObject();放在共享代码前,于是一个线程便执行,其他的线程便无法执行,当再UINT RcvMsg(LPVOID)执行一遍后,再次来到
dwWaitResult = WaitForSingleObject(hMutex ,100);前,因为下面的代码不是共享代码,而是利用他执行这句话后的结果进行判断,所以还是执行的。
不知我的理解对不对,请大家说说!
问题点数:50、回复次数:1Top
1 楼afc(afc)回复于 2003-08-02 13:02:14 得分 50
不是,同一时刻只有一个线程能得到Mutex,和是不是共享代码没有关系,可以利用Mutex的这个特性实现多个线程执行共享的代码而不互相冲突Top



