字节操作在C ++ 11中是原子的吗?

时间:2016-12-07 16:15:56

标签: multithreading c++11 atomic

对char的操作是原子的吗? 所以在线程A中我读取了char T,在线程B中我写了相同的char T,这些标准操作是原子的吗?

char a;

#thread A
{ 
if(a & 0x01)
  ...

}

#thread B
{ 
 a =0x01;
  ...

}

# ATOMIC?

谢谢!

2 个答案:

答案 0 :(得分:9)

根据C ++标准,当从多个线程使用相同的变量时,可能会发生并发访问,如果至少有一个访问是写入,则这些访问冲突

冲突的潜在并发访问构成数据竞争,这是未定义的行为,除非所有此类访问都是原子的。 volatile不会救你。

原始类型不是 atomic ,在C ++标准中使用的含义。您可以使用std::atomic模板制作原子对象。

答案 1 :(得分:-4)

在多核系统上运行时,在不同核心上运行的线程可能在本地CPU上缓存相同的参数。没有任何同步机制,线程B写入的值不能保证永远离开缓存并写入内存,线程A可以读取它。

因此,以下代码无法保证完成运行:

bool condition=false

主题A:while (!condition) {}

主题B:condition=true

为了解决这个问题,您必须将变量声明为volatile。这意味着必须在每次写入后将变量刷新到内存,并在每次读取时从内存中读取。它会降低性能,但它比互斥锁便宜。

volatile char a;