gpt4 book ai didi

c# - 如何锁定方法内容

转载 作者:太空狗 更新时间:2023-10-29 22:59:55 25 4
gpt4 key购买 nike

我有一个可以从多个线程调用的方法,但我只希望第一个线程在方法内部执行一些逻辑。所以,我打算使用一个 bool 变量。第一个进入的线程会将 bool 变量设置为 false(以防止更多线程进入),并执行方法逻辑。

进入此方法的后续线程将检查 bool 变量。因为它被第一个线程设置为 false,所以他们将跳过方法逻辑。

在代码中,是这样的:

private void myMethod()
{
if (firsTime) //set to true in the constructor
{
firstTime = false; //To prevent other thread to come inside here.
//method logic
}
}

我想使用 lock 来执行此操作,但不确定将它放在哪里。

如果我锁定在“if”内部以将 firstTime 更改为 false,则其可能的 2 个或更多线程已经进入 if(不希望这样)。

如果我锁定“if”外部以将 firstTime 更改为 false,如果 firstTime 已设置为 false,第一个线程如何进入 if 内部执行方法逻辑??

我的问题是:如何锁定才能拥有所需的功能? (第一个线程设置 bool 值并执行方法逻辑)。

我无法锁定所有方法逻辑,因为这将是一个非常耗时的操作。

最佳答案

您可以使用Interlocked.Exchange 来解决这个问题。它将给定变量的值设置为指定值并返回变量中原来的值,它会自动执行所有操作。这样做将确保只有一个线程会运行 if:

中的代码
private static int isFirst = 1;
public static void Foo()
{
if (Interlocked.Exchange(ref isFirst, 0) == 1)
{
//DoStuff
}
}

请注意 Interlocked.Exchange 没有采用 bool 的重载,这就是为什么您被迫使用 int(或其他类型),使用 1 表示真,0 表示假。

如果您想要使用 lock 而不是 Interlocked 的解决方案,您可以通过使用额外的本地 bool 值来实现:

private static bool isFirst = true;
private static object key = new object();
public static void Foo()
{
bool amFirst;
lock (key)
{
amFirst = isFirst;
isFirst = false;
}

if (amFirst)
{
//DoStuff
}
}

关于c# - 如何锁定方法内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18151054/

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