c++ - 在多线程 C++ 应用程序中,我是否需要互斥锁来保护简单的 boolean 值?

标签 c++ multithreading boolean mutex openscenegraph

我有一个多线程 C++ 应用程序,它使用 OpenSceneGraph 库进行 3D 渲染。我计划使用 boost::threads 将 OSG 的渲染循环作为一个单独的线程启动,将包含共享状态的数据结构传递给线程。我试图避免任何过于重量级的东西(如互斥锁)进行同步,因为渲染循环需要非常紧凑,而 OSG 本身试图避免不得不锁定。大多数共享状态是在线程启动之前设置的,并且永远不会改变。我确实有一些需要更改的数据,我计划对其进行双重缓冲。但是,我有一个简单的 boolean 值,用于指示线程暂停渲染,然后恢复渲染,另一个用于终止它。在这两种情况下,应用程序线程都会设置 boolean 值,而渲染线程只读取它。我需要同步对这些 boolean 值的访问吗?据我所知,可能发生的更糟糕的事情是渲染循环会在暂停或退出之前继续进行额外的帧。

最佳答案

在具有标准定义并发的 C++11 及更高版本中,使用 std::atomic<bool>以此目的。来自 http://en.cppreference.com/w/cpp/atomic/atomic :

If one thread writes to an atomic object while another thread reads from it, the behavior is well-defined (see memory model for details on data races).


对于某些编译器和某些操作环境,以下旧答案在过去的某个时候可能是正确的,但今天不应该依赖它:

你是对的,在这种情况下你不需要同步 boolean 值。你应该声明它们volatile但是,为了确保编译器每次都实际从内存中读取它们,而不是在线程中缓存上一次读取(这是一个简化的解释,但它应该为此目的)。

以下问题有更多相关信息: C++ Thread, shared data

关于c++ - 在多线程 C++ 应用程序中,我是否需要互斥锁来保护简单的 boolean 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/222916/

相关文章:

ruby-on-rails - 如何使用 Rails Ransack 过滤 boolean 属性?

delphi - 为什么delphi BoolToStr true表示为-1

c++ - 我可以在 Windows 上调用 shell 命令并将此保存到字符串的输出吗?

c# - C#中的线程中止

python - Pandas 和 numpy 线程安全

android - 停止/销毁线程

c++ - 所有版本的 GCC 都在使用在定义中具有默认类型的模板

c++ - 无法将模板类定义与 Visual Studio 2010 上的主程序链接

c++ - 带 const 的转换运算符

c++ - C++中变量之间的随机性?