我遇到了一种情况,我需要内存中两个值的原子和。我继承的代码是这样的:
int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
a 和 b 的单独读取是原子的,并且代码中其他地方对这两个内存位置的所有写入也是无锁原子的。然而,问题在于这两个位置的值可以并且确实在两次读取之间发生变化。
那么如何使这个操作原子化呢?我对 CAS 了如指掌,但它往往只涉及使读-修改-写操作原子化,而这并不是我想在这里做的。
有没有办法做到这一点,或者是重构代码的最佳选择,以便我只需要检查一个值?
编辑:谢谢,我没有提到我想在第一个修订版中无锁地执行此操作,但在我第二个修订版后有人接受了它。我知道当人们说这样的话时没有人相信,但我实际上不会使用锁。我必须用原子来模拟互斥锁,这比重构代码以跟踪一个值而不是两个值要多得多。
目前,我的调查方法涉及利用值是连续的这一事实,并通过 64 位读取原子地抓取它们,我确信这在我的目标平台上是原子的。如果有人有新的想法,请贡献!谢谢。