在多线程程序中有2个线程 - 线程1 - 将运行一个循环,将整数变量增加1000次然后退出 线程2 - 将运行一个循环,将整数变量减少1000次,然后退出
两个线程都在等待信号量并大致同时启动,并且计划在大约同一时间在不同的核心上运行。
两个线程退出后,整数变量的值是否为零? 注意:没有使用锁定(互斥等等)
让我们假设linux和x86架构以及多核硬件。
如果将相同的整数声明为volatile(C ++),上面会发生什么?
答案 0 :(得分:5)
是否存在易失性,您不能指望任何特定输出(范围[-1000,1000]除外) - 即使单个并发写入也可能破坏增量/减量的结果(即使在CPU上也不是原子的)电平)。
答案 1 :(得分:5)
如果多个线程同时修改了相同的内存位置,则程序具有数据争用并且效果未定义。结果可以是几乎任何东西,假设你得到一个结果。对于像整数类型这样的简单变量,atomics将消除数据争用并提供适当的同步。使用atomic_int
(也称为atomic<int>
)。
答案 2 :(得分:2)
你将需要使用适当的原子,并可能有完全的记忆障碍。
在这种情况下, volatile
对你没有任何作用(足够你可以使用)。
答案 3 :(得分:2)
整数读/写可能是也可能不是原子的。所以答案是否定的,结果不一定是0。
答案 4 :(得分:2)
递增和递减需要三个操作:从内存中获取值,修改它,然后将其写回内存。在大多数平台上,不能保证这三个操作都是原子执行的,除非您使用C ++ 11原子类型,编译器特定(或汇编)原子内在函数或锁定来特别请求它。
volatile
与线程同步无关;它只是确保内存访问实际发生并且相对于同一线程中的其他副作用正确排序。