Questions tagged «stdatomic»



3
std :: atomic的锁在哪里?
如果数据结构中包含多个元素,则其原子版本不能(始终)是无锁的。有人告诉我,这对于较大的类型是正确的,因为CPU无法在不使用某种锁的情况下原子地更改数据。 例如: #include <iostream> #include <atomic> struct foo { double a; double b; }; std::atomic<foo> var; int main() { std::cout << var.is_lock_free() << std::endl; std::cout << sizeof(foo) << std::endl; std::cout << sizeof(var) << std::endl; } 输出(Linux / gcc)为: 0 16 16 由于原子和foo的大小相同,因此我认为原子中不会存储锁。 我的问题是: 如果原子变量使用锁,它将存储在哪里,这对于该变量的多个实例意味着什么?
71 c++  c++11  x86  atomic  stdatomic 

1
为什么std :: atomic构造函数在C ++ 14和C ++ 17中表现不同
我在使用C ++ 11的项目中工作,并且尝试了以下代码 #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } 我收到编译器错误 error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ 对于C ++ 14,结果相同。当我切换到C ++ 17时,它可以工作:wandbox 我检查了cppreference的区别: std::atomic std::atomic<T>::operator= std::atomic<T>::atomic 但是C ++ 14和C ++ 17之间没有任何区别。为什么它与C …
19 c++  c++14  c++17  stdatomic 

4
如何在C ++ 11中实现StoreLoad障碍?
我想编写可移植的代码(Intel,ARM,PowerPC ...)来解决经典问题的变体: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something } 其中的目的是为了避免在这两个线程都在做的情况something。(如果两者都不运行,这很好;这不是一次运行的机制。)如果您在下面的推理中发现一些缺陷,请更正我。 我知道,我可以通过memory_order_seq_cst原子stores和loads 实现目标,如下所示: std::atomic<int> x{0},y{0}; void thread_a(){ x.store(1); if(!y.load()) foo(); } void thread_b(){ y.store(1); if(!x.load()) bar(); } 之所以能够达到目标,是因为 {x.store(1), y.store(1), y.load(), x.load()}事件上必须有一些总订单,并且必须与程序订单的“优势”相符: x.store(1) “在TO之前” y.load() y.store(1) “在TO之前” x.load() 如果foo()被调用,那么我们还有其他优势: y.load() “先读值” y.store(1) …

1
C11原子获取/发布和x86_64缺乏加载/存储一致性?
我在C11标准的5.1.2.4节中苦苦挣扎,尤其是Release / Acquire的语义。我注意到https://preshing.com/20120913/acquire-and-release-semantics/(以及其他)指出: ...释放语义可防止以程序顺序在写释放之前进行任何读或写操作,从而对写释放进行内存重新排序。 因此,对于以下情况: typedef struct test_struct { _Atomic(bool) ready ; int v1 ; int v2 ; } test_struct_t ; extern void test_init(test_struct_t* ts, int v1, int v2) { ts->v1 = v1 ; ts->v2 = v2 ; atomic_store_explicit(&ts->ready, false, memory_order_release) ; } extern int test_thread_1(test_struct_t* ts, int v2) { …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.