定时与终止线程使用事件不一致
Timing inconsistency with killing thread using event
我有一个多线程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函数中输入和退出消息。当发送退出信号时,如果您仍在其中一个函数中,这将使情况更加清楚。
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- void 函数中的指针参数返回不一致的值
- SDL2 + Win32 API 菜单栏单击事件不起作用
- 如何查找导致结果不一致的代码
- 跨平台 mySQL 与字符集不一致
- 定时与终止线程使用事件不一致