假设我有一个无向图。
图的一小部分:
A -----\
C
B -----/
现在节点 A 和 B 继续并行修改节点 C。 // 节点 A 和节点 B 在并行线程中处理节点 C。
我希望节点 B 的线程将等待节点 A 的线程完成处理。它必须是这样的。没有其他办法。
我也不希望正在处理其他节点的其他线程等待上述条件,即我不想使用互斥锁。
我创建了一个类成员布尔标志,并希望将其用作条件。// 让那个标志为 d_flag
此处的 MT 使用多个 CPU。
我认为不起作用的解决方案:
CPU1:线程 1
while (d_flag) {
// busy waiting
}
d_flag = true;
// Critical Section
d_flag = false;
CPU2:线程 1
while (d_flag) {
// busy waiting
}
d_flag = true;
// Critical Section
d_flag = false;
我的理解是,如果在多个 CPU 中,节点 A 线程在 CPU1 上运行,而节点 B 线程在 CPU 2 上运行,则自旋锁被击败。
由于 while 循环中的测试不再是原子的,因此可能存在两种 while 循环的计算结果为 false 的情况。
我的理解对吗??????如果是,是否有不使用整体互斥锁的解决方案。