这是``memory_order_relaxed``的正确用法?

时间:2015-07-18 12:25:25

标签: c++ multithreading c++11 atomic stdatomic

我开始使用(谨慎)C ++ 11中引入的原子基元。一个非常简单的用例是在存储应用程序的运行时配置的全局std::atomic<integral>类中使用settings

这个类有一堆静态方法来访问在程序启动时初始化的全局变量。以前,对这些全局变量的访问受mutex

的保护
#include <mutex>

class settings
{
    static unsigned get_n_threads()
    {
        std::lock_guard<std::mutex> lock(s_mutex);
        return s_n_threads;
    }
    static std::mutex s_mutex;
    static unsigned   s_n_threads;
};

std::atomic,我现在有:

#include <atomic>

class settings
{
    static unsigned get_n_threads()
    {
        return s_n_threads.load();
    }
    static std::atomic<unsigned> s_n_threads;
};

现在,我正在阅读有关原子操作的内存顺序规范:http://en.cppreference.com/w/cpp/atomic/memory_order

对于这个非常简单的用例场景,我可以修改load()对此的调用:

return s_n_threads.load(std::memory_order_relaxed);

请注意,此处唯一的要求是检查和/或更改全局设置的操作必须是原子操作。这些操作不是任何无锁算法的一部分,它们不需要对任何事物进行排序(至少目前)。

从我所做的一些研究中,看起来共识是避免放松操作,除非一个人是专家(显然我不是:),所以我想知道我可以通过申请陷入哪个陷阱(如果有的话)这种变化。

0 个答案:

没有答案