我正在尝试编写一个线程体(例如myThread
),它使用手动重置事件(例如g_myThreadEvent
)与父线程同步。
myThread
使用此事件来通知父级它已成功检索输入参数。
我想知道父级是否可以重用相同的事件来指示 myThread
退出。
以下几行中的一些内容:
child :
g_myThreadEvent = UNSIGNALLED.
myThread() {
read_inparam()
set(g_myThreadEvent);
for(;;) {
// do something important
if(is_reset(g_myThreadEvent)) break;
}
}
家长:
start_thread(){
CreateThread(myThread, some_arguments);
WaitForSingleobject(g_myThreadEvent, INFINITE);
}
stop_thread() {
reset(g_myThreadEvent);
}
这将使我能够使用单个事件来同步线程,而不是使用单独的事件来停止线程的更简单的解决方案。
最佳答案
事件没有“is-reset”状态。然而,它们确实有一个 is-set 状态(以及与之相反的状态,is-not-set)。尽管不清晰(使用单独的事件会更清楚),但当事件不再发出信号时,您的子线程可能会中断:
// in child-infinite-loop. break if event no longer signaled
if (WaitForSingleObject(g_myThreadEvent, 0) != WAIT_OBJECT_0)
break;
父线程可以通过在子线程终止时重置事件来控制这一点。正确的启动应该是这样的:
// startup the child thread
g_myThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
g_hChildThread = CreateThread(....);
WaitForSingleObject(g_myThreadEvent, INFINITE);
正确的关闭方式是:
// signal a shutdown to the running child.
ResetEvent(g_myThreadEvent);
WaitForSingleObject(g_hChildThread, INFINITE);
CloseHandle(g_hChildThread);
重要的是,您的父级应通过重置事件和等待子线程句柄上的正确关闭信号来确保子级完成。关闭竞争条件是由于不密切注意这一点而产生的。
最后,请注意,这仅适用于每个事件句柄一个子线程,如果它不满足您的特定需求,这是一个最不方便的限制。
祝你好运。
关于WaitForSingleEvent 可以等待事件重置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858572/