WaitForSingleEvent可以等待事件重置吗?

时间:2014-07-21 06:04:26

标签: c windows multithreading events

我正在尝试使用手动重置事件(例如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);
}

这将使我能够使用单个事件来同步线程,而不是使用单独的事件来停止线程的更简单的解决方案。

1 个答案:

答案 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);

通过重置事件等待子线程句柄上的正确关闭信号,您的父母应确保孩子已完成是很重要的。关闭竞争条件的出现是因为没有密切注意这一点。

最后,请注意,这仅适用于每个事件处理的一个子线程,如果它不适合您的特定需求,这是一个非常不方便的限制。

祝你好运。