WaitForSingleEvent 可以等待事件重置吗?

标签 c windows multithreading events

我正在尝试编写一个线程体(例如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/

相关文章:

linux - 这些 openssl 命令的 Windows 版本

c# - 向等待 TCP 的线程发送指令?

c - C语言打印水平空白

c - 动态内存分配的二进制加法

windows - 如何从 Windows 上的命令行查看命名管道权限

python - 我可以将 SIGINT 发送到 Windows 上的 Python 子进程吗?

python - 如何从 Azure Blob 存储并行加载文件?

wpf - WPF:另一个线程拥有的 Storyboard 循环对象

c - 在c中的结构体中声明变量

c - 如何仅使用for循环在C中向后打印输入的字符串