gpt4 book ai didi

WaitForSingleEvent 可以等待事件被重置吗?

转载 作者:可可西里 更新时间:2023-11-01 11:29:19 24 4
gpt4 key购买 nike

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

重要的是,您的 parent 应该通过重置事件等待子线程句柄上的正确关闭信号来确保 child 完成。关闭竞争条件是由于没有密切注意这一点而产生的。

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

祝你好运。

关于WaitForSingleEvent 可以等待事件被重置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com