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);
ここでの唯一の要件は、グローバル設定の検査および/または変更の操作がアトミックでなければならないということです。これらの操作は、ロックフリー アルゴリズムの一部ではなく、(少なくとも現在は) 順序付けする必要はありません。
私が行ったいくつかの調査から、コンセンサスは、専門家でない限りリラックスした操作を避けることであるように見えます (明らかに私はそうではありません:)。