在我的应用程序中,我有一个int和一个bool变量,它们可以被多个线程访问(多次写/读)。目前,我正在使用两个互斥锁,一个用于int,一个用于bool以保护这些变量。

我听说过使用原子变量和运算符编写无锁的多线程程序。我的问题是

  • 原子变量和运算符的定义是什么?
  • std::atomic
    boost/atomic.hpp 吗?哪个更标准或更受欢迎?
  • 这些库是否与平台有关?我在上使用gnu gcc 4.6
    目前是Linux,但理想情况下应该是跨平台的。我听说“原子”的定义实际上也取决于硬件。谁能解释一下?
  • 在多个线程之间共享 bool 变量的最佳方法是什么?我不希望使用“ volatile ”关键字。

  • 这些代码是线程安全的吗?
    double double_m; // double_m is only accessed by current thread.
    std::atomic<bool> atomic_bool_x;
    atomic_bool_x = true && (double_m > 12.5);
    
    int int_n; // int_n is only accessed by current thread.
    std::atomic<int> atomic_int_x;
    std::atomic<int> atomic_int_y;
    atomic_int_y = atomic_int_x * int_n;
    

    最佳答案

    我不是专家,也不是任何人,但是这是我所知道的:

  • std::atomic简单地说,并发调用loadstore(以及其他一些操作)是明确定义的。原子操作是不可分割的-“之间”不会发生任何事情。
  • 我假设std::atomic基于boost::atomic。如果可以,请使用std,否则请使用boost
  • 它们都是可移植的,std完全是这样,但是您的编译器将需要支持C++ 11
  • 可能是std::atomic_bool。您不需要使用volatile。

  • 另外,我相信load/storeoperator=/operator T不同,只有load/store是原子的。

    没关系。我检查了该标准,似乎这些运算符是根据load/store/etc定义的,但是它们可能返回不同的内容。

    进一步阅读:
  • http://en.cppreference.com/w/cpp/atomic/atomic
  • C++ 11标准
  • 操作中的C++并发
  • 关于c++ - C++ std::atomic vs.boost原子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9551750/

    10-13 07:11