如果两个数据之间的不变量必须在所有线程上保持不变,它是否会强制这些数据上的 read/write 处于临界区?

If an invariant between two datum must hold on all threads, does it forces read/write on these datum to be in critical section?

我试图在一个线程中的两个原子计数器之间建立一个不变量,同时确保在不使用互斥锁的情况下在另一个线程上读取时保持这个不变量。

然而查看代码,我似乎只是使用两个原子计数器实现了某种锁定算法(冒着搞砸的风险)。

是否可以在不使用锁定策略的情况下在线程之间共享不变量?


编辑:术语不变量可能不够用。

假设我有两个变量ab,在程序执行的某个时刻线程A设置ab 到一些不同的值,之后我会喜欢如果线程 B 加载值 a 存储通过A然后加载bb的加载值是A存储的值,而不是稍后存储在中的值b.

Is it possible to share an invariant between threads without using a locking strategy?

没有

为什么?设想以下场景:线程 X 和 Y,计数器 ab.

线程 X 写入 ab,这会导致不变量失效。假设线程 Y 尝试读取 ab 而不变量被破坏 并且没有一些锁定策略。

在这种情况下,线程 Y 可能会读取陈旧(或太新)的数据,因为 a 可能是 X 现在写入的值,或前一个。同样代表 b.

这是多线程中的经典错误,导致 data races


它类似于here描述的双链表示例。在那种情况下,线程 X 和 Y 存在并操作双链表。其中一个不变量是,如果我们遵循从一个节点 (1) 到另一个节点 (2) 的下一个指针,则来自该节点 (2) 的前一个指针将指向第一个节点 (1)。

假设线程X删除链表的一个节点,线程Y试图在那个点读取并可能导致问题,因为有可能删除该节点的前一个和下一个节点的指针X 尚未设置(因此在线程 Y 尝试读取列表时不变量被破坏)。