定时与终止线程使用事件不一致

Timing inconsistency with killing thread using event

本文关键字:事件 不一致 线程 终止 定时      更新时间:2023-10-16

我有一个多线程C++Windows应用程序。工作线程是一个等待事件处理的无限循环,其中一个事件是来自主线程的终止线程事件。问题是,有时工作线程需要很长的时间(想想秒)才能接收到kill事件并终止。其他时候它非常快(毫秒)。

// Main thread code
void deactivate()
{
while (isWorkerThreadRunning)
{
// Problem: sometimes it spends a long time in this loop
logDebug("deactivate: killing worker thread");
SetEvent(killWorker);
Sleep(20);
}
}
// Worker thread code
DWORD WINAPI WorkerThreadProc(LPVOID arglist)
{
isWorkerThreadRunning = true;
logDebug("Worker thread started");
for (bool done = false; done != true; )
{
HANDLE handles[3] = { killWorker, action1, action2 };
DWORD rc = WaitForMultipleObjects(3, handles, FALSE, INFINITE);
switch (rc)
{
case WAIT_OBJECT_0 + 0: done = true; break;
case WAIT_OBJECT_0 + 1: doAction1(); break;
case WAIT_OBJECT_0 + 2: doAction2(); break;
default: logWarn("Unhandled wait signal");
}
}
isWorkerThreadRunning = false;
logDebug("Worker thread killed");
return 0;
}

我相信,如果工作线程在doAction1()或doAction2()内繁忙时接收到一个kill事件,那么在完成并返回之前,kill事件不会被接收和处理。如果doAction1()或doAction2()需要很长时间才能返回,那么工作线程将需要很长的时间才能退出。

然而,我在doAction1()和doAction2()中散布了日志点,但在日志文件中没有看到任何这些日志点。我看到的只有:

deactivate: killing worker thread
deactivate: killing worker thread
deactivate: killing worker thread
deactivate: killing worker thread
//....many more times
Worker thead killed

这意味着工作线程不做任何工作,而是在WaitForMultipleObjects()调用内等待。

问题是,为什么WaitForMultipleObjects()调用有时需要很长时间(有时非常快)才能向事件的服务员发出信号??

将超时从INFINITE更改为某个合理的数字会解决这个问题吗?

谢谢,

isWorkerThreadRunning的声明应该是可变的,如果不是的话。如果代码不是易失性的,那么当编译器优化代码时,可能会出现一些奇怪的行为。

volatile bool isWorkerThreadRunning;

我还建议您在doAction函数中输入和退出消息。当发送退出信号时,如果您仍在其中一个函数中,这将使情况更加清楚。