高效退出多线程应用程序(具体)

问题描述 投票:0回答:2

我已经阅读了一些有关将消息从线程冒泡到所有其他线程以优雅退出(每个线程执行其自己的退出例程)的正确方法的资料。其中,我喜欢可以从任何线程标记的全局原子布尔值的想法,并且所有其他线程检查此标记以执行退出例程 - 当所有线程都加入时,主线程可以退出应用程序。

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

这样高效且安全吗?有更好的方法吗?

谢谢!

c++ multithreading parallel-processing exit
2个回答
4
投票

我不喜欢线程检查布尔(或其他)状态变量来知道何时做什么,因为这是浪费。线程必须旋转,不断检查变量以查看是否有新指令。这会烧毁CPU。

更好的选择是创建一个信号量或在 Windows 中创建一个事件,并让所有线程等待该信号量。线程可以在不忙时休眠,并且不会仅仅为了检查变量而从其他执行实际工作的线程窃取时间片。


1
投票

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

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

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

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

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

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