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

时间:2010-12-01 13:19:26

标签: c++ multithreading parallel-processing exit

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

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

这是否有效且安全?有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

How do I guarantee fast shutdown of my win32 app?

总之,这是发生的事情:

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

  • 线程A调用QueueUserAPC(),将句柄传递给线程B和函数的地址,该函数将抛出MyThreadExit类的异常。
  • 线程B正常运行,直到它调用检查可警告等待的内容。也许WaitForSingleObjectEx,也许SleepEx或其他。
  • 此时,线程B运行先前传递的APC函数,导致在线程B中抛出异常。
  • 所有堆栈分配的对象都会被正确地自动销毁,因为异常使线程B'展开'它的堆栈。
  • 线程B的最外层线程函数将捕获异常。
  • 线程B现在退出,可能向线程A发信号通知它已完成。