gpt4 book ai didi

c++ - 使用 InterlockedCompareExchange 无锁

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:51 26 4
gpt4 key购买 nike

我正在尝试使用互锁操作使以下代码片段无锁,知道如何翻译吗?

if (m_Ref == 0xFFFF)
m_Ref = 1;
else
{
if (++m_Ref == 1)
CallSomething(); //

}

我在想类似的东西

if (InterlockedCompareExchange(&m_Ref, 1, 0xFFFF) != 0xFFFF))
{
if (InterlockedIncrement(&m_Ref) == 1)
CallSomething();
}

这里面有什么问题/竞争吗?

最佳答案

从表面上看这看起来是正确的,但每次您连续使用两个互锁操作时,您都会将自己暴露在 ABA problem 之下。 .在这种情况下,一个线程无法将它从 0xFFFF 更改为 1(ICX 返回 !=0xFFFF),因此它继续执行并采用 if 分支并递增它。在它运行 InterlockedIncrement 之前,另一个线程将 m_ref 更改回 0xFFFF,并且原始线程递增 0xFFFF。根据 m_ref 的类型/语义,效果会很谨慎,但肯定会很糟糕。

对于 0xFFF 到 1 和 X 到 X+1,你应该做一个单独的 ICX 操作,如果你丢失了 ICX,总是重试:

volatile <type> m_ref;

<type> ref, newRef, icxref;
do
{
ref = m_ref;
newRef = (0xFFFF == ref) ? 1 : ++ref;
icxref = InterlockedCompareExchange (&m_ref, newRef, ref);
} while (icxref != ref);
if (newRef == 1 && ref != 0xFFFF)
{
DoSomething ();
}

关于c++ - 使用 InterlockedCompareExchange 无锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5863224/

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