我已经阅读了一些有关将消息从线程冒泡到所有其他线程以优雅退出(每个线程执行其自己的退出例程)的正确方法的资料。其中,我喜欢可以从任何线程标记的全局原子布尔值的想法,并且所有其他线程检查此标记以执行退出例程 - 当所有线程都加入时,主线程可以退出应用程序。
纯粹的计算线程可能会有不同的处理方式,对吧?
这样高效且安全吗?有更好的方法吗?
谢谢!
我不喜欢线程检查布尔(或其他)状态变量来知道何时做什么,因为这是浪费。线程必须旋转,不断检查变量以查看是否有新指令。这会烧毁CPU。
更好的选择是创建一个信号量或在 Windows 中创建一个事件,并让所有线程等待该信号量。线程可以在不忙时休眠,并且不会仅仅为了检查变量而从其他执行实际工作的线程窃取时间片。
在 Windows 中,我使用 QueueUserAPC 调用一个抛出异常的函数,导致线程干净退出。
我在这里写了更多关于这个答案的细节:
总而言之,会发生以下情况:
假设线程 A 想要终止线程 B(然后是 C、D……)
QueueUserAPC()
,将句柄传递给线程 B 以及将抛出 MyThreadExit 类异常的函数地址。WaitForSingleObjectEx
,也许SleepEx
,或者其他什么。