我研究了一些关于在线程间优雅地传递消息以使所有线程都能正常退出的正确方法。其中,我喜欢使用全局原子布尔变量的想法,该变量可以从任何线程中设置标志,而所有其他线程检查此标志以执行退出程序 - 当所有线程都加入时,主线程就可以退出应用程序。
仅进行计算的线程可能会有不同的处理方式,对吗?
这种方法是否高效且安全?有更好的方法吗?
谢谢!
我研究了一些关于在线程间优雅地传递消息以使所有线程都能正常退出的正确方法。其中,我喜欢使用全局原子布尔变量的想法,该变量可以从任何线程中设置标志,而所有其他线程检查此标志以执行退出程序 - 当所有线程都加入时,主线程就可以退出应用程序。
仅进行计算的线程可能会有不同的处理方式,对吗?
这种方法是否高效且安全?有更好的方法吗?
谢谢!
我不喜欢使用线程检查布尔(或其他)状态变量来知道何时执行某些操作,因为这是浪费的。线程将不得不旋转,不断检查变量是否有新指令。这会消耗CPU。
更好的选择是创建一个信号量或在Windows中创建一个事件,并让所有线程等待它。线程可以在空闲时休眠,而不会从其他正在执行真正工作的线程中窃取时间片,只是为了检查变量。
QueueUserAPC()
,传递给线程B的句柄和一个函数的地址,该函数将抛出MyThreadExit类的异常。WaitForSingleObjectEx
,也许是SleepEx
,或者其他什么。QueueUserAPC(Thread1, &foo)
会在 Thread1
进入“可警告等待状态”时立即调用 foo
。如果 foo
抛出异常,则会取消 Thread1 的堆栈。也就是说,你一次只能杀死一个线程,就像 TerminateThread
所做的那样。但与 TerminateThread
不同的是,RAII 互斥锁会被解锁等。 - MSalters
WaitForMultipleObjects
,其中一个句柄允许发出退出信号,另一个(或多个)句柄允许发出工作准备好的信号。如果在退出句柄上收到信号,则退出。 - Steve TownsendWaitForMultipleObjects
不会完成。 - Steve Townsend