提问人:user22155685 提问时间:10/26/2023 最后编辑:Theodor Zouliasuser22155685 更新时间:10/26/2023 访问量:95
在 .NET 中配对 MemoryBarrier 的目的是什么?
What's the purpose of pairing MemoryBarrier in .NET?
问:
https://www.albahari.com/threading/part4.aspx 中的示例代码
class Foo
{
int _answer;
bool _complete;
void A()
{
_answer = 123;
Thread.MemoryBarrier(); // Barrier 1
_complete = true;
Thread.MemoryBarrier(); // Barrier 2
}
void B()
{
Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine (_answer);
}
}
}
障碍 1 和 4 阻止此示例写入“0”。障碍 2 和 3 提供了新鲜度保证:它们确保如果 B 在 A 之后运行,读取_complete将计算为 true。
我明白的目的是提供一个完整的内存屏障,以便它上面的代码和下面的代码不会跳过,但是屏障 2 在这里有什么作用?Barrier 2 之后没有代码,为什么作者仍然使用障碍来阻止没有现有代码跳过障碍?障碍 2 和 3 如何协同工作以提供新鲜度保证?Thread.MemoryBarrier()
答:
2赞
Carl Prothman
10/26/2023
#1
包含障碍 2 以确保将来的任何代码更改都不会意外引入排序问题。特别是,它强制立即将写入刷新到主内存。
评论
0赞
user22155685
10/26/2023
有那么容易吗?但作者说“障碍 2 和 3 提供了新鲜度保证”,这对如何协同工作,尤其是它们采用不同的方法?
0赞
user22155685
10/26/2023
您的意思是 Barrier 1 主要用于围栏目的,而 Barrier 2 用于刷新缓存目的?
1赞
Carl Prothman
10/26/2023
是的,就这么简单。但你需要知道为什么......如果它是在写入之后放置的,则它会强制立即将写入刷新到主内存。如果它放在读取之前,则保证重新读取。
评论