代码之家  ›  专栏  ›  技术社区  ›  Brian Stewart

在多线程C++应用程序中,我需要互斥体来保护简单的布尔值吗?

  •  14
  • Brian Stewart  · 技术社区  · 16 年前

    我有一个多线程的C++应用程序,它用OpenScEng图库做3D渲染。我计划使用boost::threads作为一个单独的线程启动OSG的渲染循环,将包含共享状态的数据结构传递给该线程。我试图避免任何太重的东西(比如互斥体)来进行同步,因为渲染循环需要非常紧密,而OSG本身也试图避免必须锁定。大多数共享状态是在线程启动之前设置的,并且从未更改。我确实有一些数据需要更改,我计划将缓冲区加倍。但是,我有一个简单的布尔值,用于通知线程暂停渲染,然后恢复渲染,还有一个用于终止渲染。在这两种情况下,应用程序线程都设置bool,渲染线程只读取bool。我需要同步访问这些bool吗?就我所知,可能发生的最糟糕的事情是渲染循环在挂起或退出之前继续一个额外的帧。

    5 回复  |  直到 16 年前
        1
  •  16
  •   Greg Hewgill    7 年前

    在C++11及更高版本中,使用 std::atomic<bool> 为此目的。从…起 http://en.cppreference.com/w/cpp/atomic/atomic

    如果一个线程向原子对象写入数据,而另一个线程从原子对象读取数据,则该行为是定义良好的(有关数据争用的详细信息,请参阅内存模型)。


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

    volatile 不过,为了确保编译器每次都从内存中读取它们,而不是在线程中缓存以前读取的内容(这是一个简化的解释,但应该这样做)。

    C++ Thread, shared data

        2
  •  7
  •   shoosh    16 年前

    为什么不简单地使用 interlocked variable ?

        3
  •  4
  •   Tadeusz Kopec for Ukraine yespbs    7 年前

    在你的情况下,使用 std::atomic<bool> 应该足以使您的程序正确,避免您使用锁。
    不要使用 volatile . 它与线程无关。 Can I read a bool variable in a thread without mutex?

        4
  •  3
  •   Rob Walker    16 年前

    我不认为你 需要 这里是一个完全成熟的互斥体——不过如果您不使用支持wait原语的同步对象,渲染线程将需要在“挂起”状态下忙碌等待。

        5
  •  1
  •   Community CDub    7 年前

    此线程提供了更多关于线程安全性的信息和讨论,特别是对于简单数据类型:

    How can I create a thread-safe singleton pattern in Windows?