gpt4 book ai didi

c# - 非阻塞同步(MemoryBarrier)

转载 作者:行者123 更新时间:2023-11-30 18:05:09 25 4
gpt4 key购买 nike

我修改了 Non-Blocking Synchronization 上给出的程序如下:

class DemoProg
{
int _answer;
bool _complete;

public void StartDemo()
{
Thread t1 = new Thread(A);
Thread t2 = new Thread(B);
t1.Start();
// Thread.Sleep(100); // To ensure that B is called after A.
t2.Start();
}

void A()
{
for (int i = 0; i < 1000000; i++)
_answer = 123;
Thread.MemoryBarrier(); // Barrier 1
_complete = true;
Thread.MemoryBarrier(); // Barrier 2
Console.WriteLine("Exiting A");
}

void B()
{
//Thread.Sleep(100);
Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine(_answer);
}
Console.WriteLine("Exiting B");
}
}

这篇文章指出,他们确保如果 B 在 A 之后运行,读取 _complete 的结果将是 true。 >> 他们意味着内存障碍。

即使我删除了内存屏障,输出也没有变化。 并且它不能确保 if 条件结果为真。

我是不是理解错了?

谢谢。

最佳答案

我谈到这个例子herehere .

简而言之,作者是正确的。请密切注意声明。特别要注意作者说“如果 B 追赶 A”。他并不是说条件将总是评估为真。相反,该示例旨在展示内存屏障的一种特殊细微差别。

此外,通过移除内存屏障获得不同的结果将很难重现。这件事情是由很多原因导致的。这可能是由于您运行测试的环境所致。

关于c# - 非阻塞同步(MemoryBarrier),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5853748/

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