相关疑难解决方法(0)

C++是否读取和写入了原子?

我有两个线程,一个更新一个int,另一个读取它.这是一个统计值,其中读取和写入的顺序无关紧要.

我的问题是,我是否需要同步访问这个多字节值?或者,换句话说,写入的一部分可以完成并被中断,然后读取就会发生.

例如,假设值= 0x0000FFFF,其值递增为0x00010000.

是否有时间值看起来像0x0001FFFF,我应该担心?当然,类型越大,发生这种情况的可能性就越大.

我总是同步这些类型的访问,但很好奇社区的想法.

c++ multithreading synchronization

79
推荐指数
4
解决办法
3万
查看次数

原子操作,std :: atomic <>和写入顺序

GCC汇编了这个:

#include <atomic>
std::atomic<int> a; 
int b(0);

void func()
{
  b = 2; 
  a = 1;
}
Run Code Online (Sandbox Code Playgroud)

对此:

func():
    mov DWORD PTR b[rip], 2
    mov DWORD PTR a[rip], 1
    mfence
    ret
Run Code Online (Sandbox Code Playgroud)

所以,为我澄清一些事情:

  • 读取'a'的任何其他线程是否保证将'b'读为2.
  • 为什么MFENCE在写入"a"之后才发生.
  • 无论如何,对"a"的写入保证是原子(在狭窄的非C++意义上)操作,这是否适用于所有英特尔处理器?我假设这个输出代码.

另外,clang(v3.5.1 -O3)这样做:

mov dword ptr [rip + b], 2
mov eax, 1
xchg    dword ptr [rip + a], eax
ret
Run Code Online (Sandbox Code Playgroud)

这似乎对我的小脑子更直接,但为什么不同的方法,每个方法的优势是什么?

c++ compiler-construction x86 assembly

11
推荐指数
1
解决办法
2267
查看次数