gpt4 book ai didi

c# - 锁在 C# 中不起作用

转载 作者:太空狗 更新时间:2023-10-30 01:05:37 24 4
gpt4 key购买 nike

Lock 未按预期工作,这是代码。我在这里应用线程,但我会将它应用到 ASP.NET 应用程序。

class Program
{
static void Main(string[] args)
{
ThreadManager.CurrentSession = 0;
for (int i = 0; i < 10; i++)
{
CreateWork objCreateWork = new CreateWork();
ThreadStart start = new ThreadStart(objCreateWork.ProcessQuickPLan);
new Thread(start).Start();
}
Console.ReadLine();
}
}

class CreateWork
{
private object CurrentSession = -1;
public void ProcessQuickPLan()
{
lock (CurrentSession)
{
CurrentSession = ThreadManager.CurrentSession;
Console.WriteLine(CurrentSession);
ThreadManager.CurrentSession = Convert.ToInt32(ThreadManager.CurrentSession) + 1;
}
}
}

class ThreadManager
{
public static object CurrentSession
{
get;
set;
}
}

它给了我以下输出

0
0
0
3
4
4
6
7
8
9

我很期待

0
1
2
3
4
5
6
7
8
9

我哪里做错了?

我是否应该按照此处所述使用readonly object C# lock(mylocker) not work

最佳答案

问题出在您用来锁定的对象上。您使用的是实例变量,因此每个实例都有自己的 lock,这是根本错误的。

第二个问题是使用-1 进行初始化,这至少令人困惑。

简单的解决方案是 static object CurrentSession = new object();

下一个问题是 CurrentSession = ThreadManager.CurrentSession; 。这是没有意义的,而且本质上是错误的。我很惊讶它甚至可以编译。

class CreateWork
{
private object CurrentSession = -1; // boxed int, Id only
private static object _locker = new object();

public void ProcessQuickPLan()
{
lock (_locker)
{
CurrentSession = ThreadManager.CurrentSession;
Console.WriteLine(CurrentSession);
ThreadManager.CurrentSession = Convert.ToInt32(ThreadManager.CurrentSession) + 1;
}
}
}

总结:不清楚您要在这里做什么。 CurrentSession 好像兼有锁守卫和Id 的双重作用。这不是一个好计划。

基本上您需要 1 个私有(private)静态对象来保护资源。初始化后永远不要分配给它。

关于c# - 锁在 C# 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144681/

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