gpt4 book ai didi

multithreading - 有没有办法让两次读取原子化?

转载 作者:行者123 更新时间:2023-12-04 14:07:56 25 4
gpt4 key购买 nike

我遇到了需要内存中两个值的原子和的情况。我继承的代码是这样的:

int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;

a 和 b 的单独读取是原子性的,代码中其他地方对这两个内存位置的所有写入也是无锁原子性的。然而,问题是两个位置的值可以并且确实在两次读取之间发生变化。

那么如何使这个操作原子化呢?我对 CAS 一无所知,但它往往只涉及使读-修改-写操作原子化,而这并不是我在这里想要做的。

有没有办法做到这一点,或者是重构代码以便我只需要检查一个值的最佳选择?

编辑:谢谢,我没有提到我想在第一次修订时无锁地做这件事,但有些人在我的第二次修订后接受了它。我知道没有人会相信人们说这样的话,但我实际上不能使用锁。我必须用原子模拟互斥锁,这比重构代码以跟踪一个值而不是两个值要多得多。

现在,我的调查方法涉及利用值是连续的这一事实,并通过 64 位读取以原子方式获取它们,我确信这在我的目标平台上是原子的。如果有人有新的想法,请贡献!谢谢。

最佳答案

您必须确保在读取或写入这两个值中的任何一个时,它们都被内存屏障(锁或临界区)包围。

// all reads...
lock(lockProtectingAllAccessToMemoryOneAndTwo)
{
a = *MemoryLocationOne;
b = *MemoryLocationTwo;
}

...
// all writes...
lock(lockProtectingAllAccessToMemoryOneAndTwo)
{
*MemoryLocationOne = someValue;
*MemoryLocationTwo = someOtherValue;
}

关于multithreading - 有没有办法让两次读取原子化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/736365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com