リラックスしたメモリの順序付けについてより深く理解しようとしています。CPP リファレンスによると、同期はありませんが、アトミック性は保証されています。この場合のアトミック性は、何らかの形式の同期を必要としません。たとえば、特に書き込みが異なるスレッドに順不同で表示される場合、 1 つのスレッドのみが からにfetch_add()
値を更新することをどのように保証しますか? に関連する暗黙の同期はありますか?y
y+1
fetch_add
memory_order_relaxed 緩和された操作: 他の読み取りまたは書き込みに課される同期または順序付けの制約はなく、この操作の原子性のみが保証されます (以下の緩和された順序付けを参照)。
#include <thread>
#include <iostream>
#include <atomic>
#include <vector>
#include <cassert>
using namespace std;
static uint64_t incr = 100000000LL;
atomic<uint64_t> x;
void g()
{
for (long int i = 0; i < incr; ++i)
{
x.fetch_add(1, std::memory_order_relaxed);
}
}
int main()
{
int Nthreads = 4;
vector<thread> vec;
vec.reserve(Nthreads);
for (auto idx = 0; idx < Nthreads; ++idx)
vec.push_back(thread(g));
for(auto &el : vec)
el.join();
// Does not trigger
assert(x.load() == incr * Nthreads);
}