Denis Yaroshevskiy
old = cfg.exchange(new config(2), acq_rel);
domain.synchronize();
delete old;
cfg.store(release); // old = cfg.exchange(new config(2), acq_rel);
counter.load(acquire); // domain.synchronize();
delete old;
cfg.store(release); // old = cfg.exchange(new config(2), acq_rel);
counter.load(); // domain.synchronize();
delete old;
cfg.store(); // old = cfg.exchange(new config(2));
counter.load(); // domain.synchronize();
delete old;
// updater
cfg.store(release);
...
counter.load(...)
// reader
counter.store(...)
...
config.load(acquire)
// updater
cfg.store(release);
atomic_thread_fence(seq_cst);
counter.load(relaxed);
// reader
counter.store(relaxed);
atomic_thread_fence(seq_cst);
config.load(acquire);
// updater
cfg.store(release);
atomic_thread_fence_heavy();
counter.load(relaxed);
// reader
counter.store(relaxed);
atomic_thread_fence_light();
config.load(acquire);
asm volatile("" : : : "memory")
std::scoped_lock _{std::rcu_default_domain()};
auto* old = cfg_.exchange(new Config ...);
std::rcu_synchronize();
delete old;
auto* old = cfg_.exchange(new Config ...);
std::rcu_retire(old);