对char的操作是原子的吗? 所以在线程A中我读取了char T,在线程B中我写了相同的char T,这些标准操作是原子的吗?
char a;
#thread A
{
if(a & 0x01)
...
}
#thread B
{
a =0x01;
...
}
# ATOMIC?
谢谢!
答案 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;