从多线程应用程序中有效退出(细节)

one*_*ute 6 c++ parallel-processing multithreading exit

我已经阅读了一些关于将消息从一个线程冒泡到所有其他线程以正常退出的正确方法的几个来源(每个线程都执行它自己的退出例程).其中,我喜欢可以从任何线程标记的全局原子布尔的想法,并且所有其他线程检查此标志以执行退出例程 - 当所有线程连接时,主线程可以退出应用程序.

纯粹的计算线程可能会以不同的方式处理,对吧?

这是有效和安全的吗?有一个更好的方法吗?

谢谢!

Rod*_*ddy 1

在 Windows 中,我使用 QueueUserAPC 调用一个引发异常的函数,导致线程干净退出。

我在这个答案中写了更多关于细节的内容:

如何保证 win32 应用程序快速关闭?

总而言之,会发生以下情况:

假设线程 A 想要终止线程 B(然后是 C、D……)

  • 线程 A 调用QueueUserAPC(),将句柄传递给线程 B 以及将引发 MyThreadExit 类异常的函数的地址。
  • 线程 B 正常运行,直到它调用检查可警报等待的内容。也许WaitForSingleObjectEx,也许SleepEx,或者别的什么。
  • 此时,线程B运行之前传递的APC函数,导致线程B抛出异常。
  • 当异常使线程 B“展开”其堆栈时,所有堆栈分配的对象都会自动正确销毁。
  • 线程B的最外层线程函数会捕获该异常。
  • 线程 B 现在退出,可能向线程 A 发出信号,表明它已完成。