使用 const bool 参考进行后台任务取消跟踪? (C++)
Using const bool reference for background task cancellation tracking? (C++)
我有一个桌面应用程序,当用户请求时,某些计算在后台线程中 运行。有一个取消按钮。
我知道 "safe" 或 "correct" 向后台任务发出取消信号的方法(使用 Qt signal/slot 连接,后台任务轮询的互斥包装布尔值等。 ).
然而,在我看来最简单的事情是在我的主线程 class 中有一个 bool cancelled
,它在按下取消按钮时同步设置,并传递一个 const bool &cancelled
到它轮询的后台线程。
这种方法是否有任何现实的方法会适得其反?
只要您尊重线程间数据访问的细节(在 MSVC 中,标志变量应该是 volatile*;要么以原子方式设置它,要么之后执行写屏障),这很好。这是一种很常见的方法。
*volatile
通常不是执行此操作的正确方法,但 MSVC 的语义使其成为确保写入可见性的有效方法。
线程可能 运行 在不同的处理器上,每个处理器都有自己的缓存。如果布尔值是原子的,你可以这样做。否则,您可能会冒更改仅传播到最近的缓存而其他线程不可见的风险。
我有一个桌面应用程序,当用户请求时,某些计算在后台线程中 运行。有一个取消按钮。
我知道 "safe" 或 "correct" 向后台任务发出取消信号的方法(使用 Qt signal/slot 连接,后台任务轮询的互斥包装布尔值等。 ).
然而,在我看来最简单的事情是在我的主线程 class 中有一个 bool cancelled
,它在按下取消按钮时同步设置,并传递一个 const bool &cancelled
到它轮询的后台线程。
这种方法是否有任何现实的方法会适得其反?
只要您尊重线程间数据访问的细节(在 MSVC 中,标志变量应该是 volatile*;要么以原子方式设置它,要么之后执行写屏障),这很好。这是一种很常见的方法。
*volatile
通常不是执行此操作的正确方法,但 MSVC 的语义使其成为确保写入可见性的有效方法。
线程可能 运行 在不同的处理器上,每个处理器都有自己的缓存。如果布尔值是原子的,你可以这样做。否则,您可能会冒更改仅传播到最近的缓存而其他线程不可见的风险。