gpt4 book ai didi

.net - .NET 中何时使用锁 vs MemoryBarrier

转载 作者:行者123 更新时间:2023-12-04 00:36:59 25 4
gpt4 key购买 nike

在 .NET 中 lock关键字是 Monitor.Enter 周围的语法糖和 Monitor.Exit ,所以你可以说这段代码

lock(locker)
{
// Do something
}

是一样的
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}

然而,.NET 框架还包括 MemoryBarrier以类似方式工作的类
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();

我很困惑什么时候我想使用 Thread.MemoryBarrierlock/ Monitor版本? a Threading Tutorial让我更加困惑这表明它们的功能相同。

据我所知,明显的区别是不需要锁定对象,我猜这是使用 Monitor你可以跨线程做一些事情 MemoryBarrier在一个线程上。

我的直觉告诉我另一个关键区别是 MemoryBarrier仅适用于变量,不适用于方法。

最后,这与现有问题无关 When to use ‘volatile’ or ‘Thread.MemoryBarrier()’ in threadsafe locking code? (C#) ,因为它专注于 volatile我理解它的用法的关键字。

最佳答案

在我看来你几乎不应该使用 Thread.MemoryBarrier .这用于无锁代码 - 确保在一个线程上所做的更改对另一个线程可见,而不会产生锁定成本。它不控制线程同步,不像 lock .我在 Joe 的教程中没有看到他说 MemoryBarrier “功能相同”与 lock .你能解释一下你从哪里得到这种印象吗?

在我看来,除了主要精通并发性的开发人员之外,低级无锁代码对于几乎任何人来说都太难了。如果我想编写一些无锁代码,我将使用由这些开发人员构建的更高级别的构建块(例如 .NET 4.0 中的 Parallel Extensions),而不是尝试自己开发。

举个例子,我最近对volatile的确切含义大开眼界。这不是“总是从主内存读取,总是直接写入主内存”。 (我自己的线程教程目前仍然有这个解释 - 我需要在某个时候修复。)It's far more subtle than that .这意味着我之前对 volatile 的一些使用可能是不正确的。

关于.net - .NET 中何时使用锁 vs MemoryBarrier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005211/

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