gpt4 book ai didi

C# Interlocked 用作锁定机制?

转载 作者:行者123 更新时间:2023-12-03 12:45:07 26 4
gpt4 key购买 nike

在我阅读 ReaderWriterLockSlim 时锁机构,There was this guy谁建议 Interlock函数可用于更精细的锁定

另外,我发现 here马克的另一个回答:

...Writes make their change to a cloned copy, then use Interlocked.CompareExchange to swap the reference (re-applying their change if another thread mutated the reference in the interim).



好吧,目前我所知道的 Interlocked object ,是它用于(在多线程环境中)做原子 additions , compare , compareExchange操作。 (我知道如何使用它)

但是(这是我的问题)——

问题

如何将其用作锁? (示例代码将不胜感激)

编辑

为简单起见,我粘贴此代码(这不是线程安全的 - 如果 Go 被两个线程同时调用,则可能会出现被零除的错误):
class ThreadUnsafe
{
static int _val1 = 1, _val2 = 1;

static void Go()
{
if (_val2 != 0) Console.WriteLine (_val1 / _val2);
_val2 = 0;
}
}

如何使用联锁来更换锁(这可以解决问题)?

最佳答案

Interlocked用于实现无锁算法和数据结构。因此,它不是“更精细的锁定”,甚至根本不是锁定。它可以让您在多线程环境中安全地执行小型且定义明确的操作:例如,如果您希望两个线程递增同一个变量,您可以使用 Interlocked这样做而不是获取重量级锁并使用“常规增量”。

但是,Interlocked 不能做很多很多事情。你可以在普通锁下做。例如,任何涉及以原子方式修改多个变量的操作通常都无法使用 Interlocked 来完成。 ,因此您将无法将其用于您的示例。
Interlocked但是,可以帮助开发人员实现锁定机制,尽管您不妨使用内置的。大多数锁需要内核支持来中断被阻塞的线程,直到锁可用。因此,您可以使用 Interlocked 实现的唯一一种锁。单独一个是自旋锁:线程不断尝试获取直到它工作的锁。

class InterlockedLock
{
private int locked;

public void Lock()
{
while (Interlocked.CompareExchange(ref locked, 1, 0) != 0)
continue; // spin
}

public void Unlock()
{
locked = 0;
}
}

在本例中, locked最初为零。当一个线程第一次尝试获取它时, locked变为 1,随后的线程试图 Lock它会一直旋转,直到有人调用 Unlock制作 locked又是 0。

关于C# Interlocked 用作锁定机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23842935/

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