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