我正在尝试使用手动重置事件(例如myThread
)编写与父线程同步的线程主体(例如,g_myThreadEvent
)。
myThread
使用此事件通知父级已成功检索输入参数。
我想知道父母是否可以重复使用同一事件来表示myThread
退出。
以下几行:
孩子:
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);
}
这将使我能够使用单个事件来同步线程,而不是使用单独的事件来停止线程的更简单的解决方案。
答案 0 :(得分:3)
事件没有"重置"州。但是,它们确实处于置位状态(与此相反,未设置)。清晰度不尽如人意(使用单独的事件会更加 更清楚),您的子线程可能会在事件不再发出信号时中断:
// 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);
通过重置事件和等待子线程句柄上的正确关闭信号,您的父母应确保孩子已完成是很重要的。关闭竞争条件的出现是因为没有密切注意这一点。
最后,请注意,这仅适用于每个事件处理的一个子线程,如果它不适合您的特定需求,这是一个非常不方便的限制。
祝你好运。