读写冲突会引发无限循环吗?

时间:2010-01-14 04:12:17

标签: multithreading thread-safety parallel-processing

假设有一条语句在等待另一个线程更新变量。

#in thread1:
while (flag == 0);

如果没有使用任何类型的锁,如果一个线程在被另一个线程更新时读取该变量,则可能存在读写冲突。

#in thread2:
flag = 1;

这会导致无限循环吗?或者冲突只会延迟线程#1?

提前致谢,

3 个答案:

答案 0 :(得分:2)

如果flag未标记为volatile,则可能无法更新,因为while循环代码可能正在引用寄存器中缓存的值。

答案 1 :(得分:0)

(假设是c / c ++):如果(flag)没有声明为volatile,则thread1可能正在从寄存器中读取flag的值,因此它可能永远不会看到thread2将flag的内存位置更改为1,因此thread1可能会继续即使thread2将标志设置为1,也会永远循环。

另一种可能性是thread1以比thread2更高的优先级运行,因此thread2永远不会有机会运行并设置flag = 1,因为thread1永远占用CPU全部自身。

答案 2 :(得分:0)

如图所示,如果没有其他事情发生,只要线程2中的每一行都执行,那么thread1将不会处于您上面描述的无限循环中。在大多数情况下,由于线程实际上并不执行并发执行,因此除非您在多个CPU内核上运行,否则两条线路不能同时执行。

请注意,我必须非常小心我的措辞,因为还有很多其他事情可能会出错。