【发布时间】:2021-09-02 09:31:08
【问题描述】:
背景 我正在完成将我的 MFC 框架项目从原型升级到 alpha 生产代码。任务是同步其线程。我混合使用了互斥锁、条件变量和二进制信号量。这在很大程度上是成功的。与我的问题最相似的 stackoverflow 案例是 std::condition_variable wait() and notify_one() synchronization。
问题 但是,有时,在新建从 CWinThread (RxWs2SocketThread) 派生的某个类之后会出现原子性问题。 RxWs2SocketThread 切换到新类的线程并执行 InitInstance 并再次切换回来,就像它应该做的那样。在单线程程序中,当调用 ResumeThread 时,线程切换到 InitInstance 没有问题,但在我的多线程程序中,我必须控制切换。代码如下:
在第 95 行和第 102 行之间偶尔会发生失败。这是显示成功切换的应用日志:
左边的数字是线程号。行号在括号中,如 [100]。请注意,[100] 是第 102 行实际 wait 调用的检测工具。此应用程序日志显示了失败的示例:
在此日志中,notify_one 发生在 wait 之前,这会导致程序挂起。请注意应用日志中的第 [100] 行,它表示第 [102] 行代码中的 wait 调用。
问题 这告诉我我需要在 ResumeThread 和 std::condition_variable.wait() 调用之间提供原子性。我怎样才能做到这一点?我必须恢复类线程,否则不会调用InitInstance,但是恢复线程后我不能等待。
【问题讨论】:
标签: c++ windows multithreading mfc synchronization