假设有一条语句在等待另一个线程更新变量。
#in thread1:
while (flag == 0);
如果没有使用任何类型的锁,如果一个线程在被另一个线程更新时读取该变量,则可能存在读写冲突。
#in thread2:
flag = 1;
这会导致无限循环吗?或者冲突只会延迟线程#1?
提前致谢,
答案 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内核上运行,否则两条线路不能同时执行。
请注意,我必须非常小心我的措辞,因为还有很多其他事情可能会出错。