Tag: stdatomic

为什么不编译器合并多余的std :: atomic写道?

我想知道为什么没有编译器准备将相同的值连续写入一个单一的primefacesvariables,例如: #include <atomic> std::atomic<int> y(0); void f() { auto order = std::memory_order_relaxed; y.store(1, order); y.store(1, order); y.store(1, order); } 我试过的每一个编译器都会发出上面的三次。 什么合法的,无竞争的观察者可以看到上面的代码和单个写入的优化版本(即不适用“as-if”规则)之间的区别? 如果variables是易变的,那么显然没有优化是适用的。 什么阻止了我的情况? 这是编译器资源pipe理器中的代码。

在x64上使用非临时存储获取/释放语义

我有这样的东西: if (f = acquire_load() == ) { … use Foo } 和: auto f = new Foo(); release_store(f) 你可以很容易地想象一下,使用带有load(memory_order_acquire)和store(memory_order_release)的primefaces的acquire_load和release_store的实现。 但是现在如果release_store是通过_mm_stream_si64实现的,这是一个非暂时写入,而不是相对于x64上的其他存储进行sorting的呢? 如何获得相同的语义? 我认为以下是最低要求: atomic<Foo*> gFoo; Foo* acquire_load() { return gFoo.load(memory_order_relaxed); } void release_store(Foo* f) { _mm_stream_si64(*(Foo**)&gFoo, f); } 并如此使用它: // thread 1 if (f = acquire_load() == ) { _mm_lfence(); … use Foo } 和: […]