2

我开始(谨慎地)使用 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);

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

从我所做的一些研究来看,似乎共识是避免放松操作,除非一个人是专家(显然我不是:),所以我想知道通过应用这个改变我会陷入哪个陷阱(如果有的话)。

4

0 回答 0