由于多线程运行是抢占式的,子线程可能一大段代码运行完成了,主线程还未往后跑一步
如下所示代码,意图为重置主线程信号,等待所有子线程执行完成后再执行主线程
子线程代码完成后会重置子线程信号,激活主线程信号,再等待主线程产生子线程激活信号
但实际上是有问题的
预期逻辑为:
激活子线程信号(主)
重置主线程信号(主)
子线程进入循环(子)
激活主线程(子)
重置子线程(子)
等待所有子线程激活主线程(主)
实际执行逻辑为:
激活子线程信号(主)
此时主线程挂起(主)
子线程进入循环(子)
激活主线程(子)
重置子线程(子)
重置主线程信号(主)等待所有子线程激活主线程(主) 永远等待下去
错误模式:
for (int ii=0;ii<nThreadCount;ii++)
{
SetEvent(threadParamArrary[ii].hSubEvent); //激活子线程信号
ResetEvent(threadParamArrary[ii].hMainEvent); //清除主线程信号
}
WaitForMultipleObjects(nThreadCount,pEventHandle,TRUE,0xffffffff);
正确模式:
for (int ii=0;ii<nThreadCount;ii++)
{
SetEvent(threadParamArrary[ii].hSubEvent); //激活子线程信号
ResetEvent(threadParamArrary[ii].hMainEvent); //清除主线程信号
}
WaitForMultipleObjects(nThreadCount,pEventHandle,TRUE,0xffffffff);