多线程执行a=0是否存在竞态条件?全局变量最终值能否非0?
问题
假设有5个线程执行以下代码:
barrier(); a = 0;
其中a是全局int类型变量。是否有可能在所有线程都执行完上述赋值代码后,a的值不为0?
回答
不可能,所有线程执行完赋值操作后,a的值一定是0。
核心原因有两点:
- 线程屏障的同步保证:
barrier()作为线程同步屏障,会让所有5个线程都阻塞在这个调用点,直到全部线程都到达此处,才会允许所有线程继续执行后续的a = 0。也就是说,所有线程的赋值操作都是在屏障放行后才开始的,不存在某线程还没到屏障就提前执行赋值的情况。 - 赋值操作的结果确定性:不管线程们以什么顺序执行
a = 0,每个操作都是把a设置为0。哪怕在某些架构上int的赋值不是原子操作(比如拆分多步写内存),每一步写的都是0,最终a的所有位都会被置0;如果是原子赋值,最后一个完成的写操作也会将a固定为0。
本质上所有线程都在写入同一个固定值0,无论执行顺序如何交错,最终结果必然是0。
内容的提问来源于stack exchange,提问作者Me- La Ría
相关产品推荐
相关产品推荐

