我开始使用(谨慎)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);
请注意,此处唯一的要求是检查和/或更改全局设置的操作必须是原子操作。这些操作不是任何无锁算法的一部分,它们不需要对任何事物进行排序(至少目前)。
从我所做的一些研究中,看起来共识是避免放松操作,除非一个人是专家(显然我不是:),所以我想知道我可以通过申请陷入哪个陷阱(如果有的话)这种变化。