gpt4 book ai didi

c# - 如何使静态变量线程安全

转载 作者:太空狗 更新时间:2023-10-29 18:00:28 29 4
gpt4 key购买 nike

我有一个静态类,其中包含一个静态变量(一个简单的 int)。我在线程的Run()方法中实现了一个lock(),这样其他线程就不能并发访问这个类了,但是变量还是会变疯,显示重复项、异常高的值等。

这是类:

public static class ExplorationManager
{
public static int Counter = 0;

public static void ExplorerMaker(List<int[]> validPaths, List<string> myParents, string[,] myExplorationMap, List<int[]> myPositions)
{
foreach (var thread in validPaths.Select
(path => new Explorer(myParents, path, myExplorationMap, myPositions)).
Select(explorer => new Thread(explorer.Explore)))
{
thread.Name = "Thread of " + Counter + " generation";
Counter++;
thread.Start();
}
}

有没有办法让这个变量“更”线程安全?

最佳答案

为了提高这种类型的安全性,您至少需要解决 2 个问题。

第一个是使Counter private。在当前形式下,该变量是 100% 公开的,它可以被应用程序中的任何代码片段改变。今天它可能是安全的,但没有什么可以保护你明天不犯错误。如果您仍希望其他代码段能够读取该属性,请使用访问器

private static int m_counter;
public static int Counter {
get { return m_counter; }
}

第二个问题是 ++ 在线程间共享的位置上不是安全操作。它扩展为以下代码

Counter = Counter + 1;

现实中是这样的

  1. 负载计数器
  2. 加载 1
  3. 添加
  4. 商店柜台

线程几乎可以随时被中断。如果一个线程在第 1、2 或 3 步中断,而另一个线程完全执行该序列,那么您将最终添加/存储陈旧值。这就是 ++ 不安全的原因。在线程之间递增共享值的安全方法是使用 Interlocked.Increment。它正是为此目的而设计的

Interlocked.Increment(ref m_counter);

关于c# - 如何使静态变量线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12981190/

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