Questions tagged «atomic»

原子操作是不可分割的。该术语用于描述数据库中的事务,多线程程序中的低级访问以及文件系统操作等。

2
id = 1-id是原子吗?
在OCP Java SE 6程序员实践考试的第291页中,问题25: public class Stone implements Runnable { static int id = 1; public void run() { id = 1 - id; if (id == 0) pick(); else release(); } private static synchronized void pick() { System.out.print("P "); System.out.print("Q "); } private synchronized void release() { System.out.print("R "); …


3
为什么在std :: atomic中使用了volatile限定符?
从我从Herb Sutter和其他人那里读到的内容来看volatile,至少在C / C ++方面,您会认为并发编程是完全正交的概念。 但是,在GCC实现中,所有std::atomic的成员函数都具有volatile限定符。在Anthony Williams的实现中也是如此std::atomic。 那怎么办,我的atomic<>变量是否需要volatile?
72 c++  c++11  atomic  volatile 

6
如何在不使用<mutex>的情况下在C ++ 11中实现多线程安全单例
既然C ++ 11具有多线程功能,我想知道在不使用互斥对象的情况下实现延迟初始化单例的正确方法是什么(出于性能原因)。我想到了这一点,但是tbh Im并不太擅长编写无锁代码,因此Im正在寻找更好的解决方案。 // ConsoleApplication1.cpp : Defines the entry point for the console application. // # include &lt;atomic&gt; # include &lt;thread&gt; # include &lt;string&gt; # include &lt;iostream&gt; using namespace std; class Singleton { public: Singleton() { } static bool isInitialized() { return (flag==2); } static bool initizalize(const string&amp; name_) …

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

2
原子向量的初始化
考虑: void foo() { std::vector&lt;std::atomic&lt;int&gt;&gt; foo(10); ... } foo的内容现在有效吗?还是我需要显式循环并初始化它们?我检查了Godbolt,它看起来还不错,但是在这一点上,该标准似乎很混乱。 所述的std ::矢量构造器表示,它插入默认插入的实例std::atomic&lt;int&gt;,这是初始化值经由放置new。 我认为这种价值初始化的效果适用: 2)如果T是具有默认构造函数的类类型,该构造函数既不是用户提供也不是未删除的(也就是说,它可能是带有隐式定义或默认默认构造函数的类),则将该对象初始化为零,然后将其如果具有非平凡的默认构造函数,则默认初始化; 因此在我看来,原子是零初始化的。所以问题是,是否std::atomic&lt;int&gt;在有效对象中对结果进行零初始化? 我猜答案是“在实践中是,但没有真正定义”? 注意:此答案同意它是零初始化的,但是并没有真正说明是否意味着该对象有效。
12 c++  vector  atomic 

2
在程序员一级使用C ++ std :: atomic可以保证什么?
我已经听过并阅读了有关的几篇文章,演讲和stackoverflow问题std::atomic,并且我想确保自己已经很好地理解了。由于MESI(或派生的)高速缓存一致性协议,存储缓冲区,使队列无效等可能存在延迟,因此我仍然对高速缓存行的可见性感到困惑。 我读到x86具有更强的内存模型,并且如果缓存失效被延迟,x86可以还原启动的操作。但是我现在只对我作为独立于平台的C ++程序员应该承担的兴趣感兴趣。 [T1:线程1 T2:线程2 V1:共享原子变量] 我了解std :: atomic可以保证, (1)在变量上不发生数据争用(由于对缓存行的独占访问)。 (2)取决于我们使用哪种memory_order,它(在有障碍的情况下)保证发生顺序一致性(在障碍之前,之后或之后)。 (3)在T1上执行原子write(V1)之后,T2上的原子RMW(V1)将是连贯的(其缓存行将已用T1上的写入值进行更新)。 但是正如缓存一致性入门所述, 所有这些事情的含义是,默认情况下,加载可以获取过时的数据(如果相应的失效请求位于失效队列中) 那么,以下正确吗? (4)std::atomic不保证T2在T1上执行原子write(V)之后不会读取原子read(V)上的“陈旧”值。 问题(4)是否正确:如果无论延迟如何,在T1上进行原子写入都会使高速缓存行无效,那么当原子RMW操作而不是在原子读取上进行操作时,T2为什么要等待无效生效? 问题(4)是否错误:线程何时可以在执行过程中读取“过时”值并且“可见”? 非常感谢您的回答 更新1 所以看来我在(3)上错了。想象以下交织,初始V1 = 0: T1: W(1) T2: R(0) M(++) W(1) 即使在这种情况下,保证T2的RMW完全在W(1)之后发生,它仍然可以读取“过时的”值(我错了)。据此,atomic不能保证完全的缓存一致性,而只能保证顺序一致性。 更新2 (5)现在想象这个例子(x = y = 0并且是原子的): T1: x = 1; T2: y = 1; T3: if (x==1 &amp;&amp; y==0) print("msg"); …

1
这个C ++ AtomicInt实现正确吗?
前提:我正在使用甚至没有C ++ 11(带有std::atomic&lt;int&gt;)的ARM嵌入式(几乎是裸机)环境,因此请避免回答“ 仅使用标准C ++”std::atomic&lt;int&gt; ”:我不能。 这个AtomicInt的ARM 实现正确吗?(假设ARM体系结构是ARMv7-A) 您看到一些同步问题吗?是否volatile需要/有用? // File: atomic_int.h #ifndef ATOMIC_INT_H_ #define ATOMIC_INT_H_ #include &lt;stdint.h&gt; class AtomicInt { public: AtomicInt(int32_t init = 0) : atom(init) { } ~AtomicInt() {} int32_t add(int32_t value); // Implement 'add' method in platform-specific file int32_t sub(int32_t value) { return add(-value); } int32_t …
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.