c#锁不起作用/关键部分
我试图在FOR循环中使用两个不同的线程来提升一个静态(int)计数器,因此如果循环运行10次,我(应该)得到counter=20。出于某种原因,每次运行循环(19,20,21)时,我都会得到不同的值,即使我使用锁访问该计数器(代码在控制台中运行):c#锁不起作用/关键部分,c#,.net,multithreading,locking,critical-section,C#,.net,Multithreading,Locking,Critical Section,我试图在FOR循环中使用两个不同的线程来提升一个静态(int)计数器,因此如果循环运行10次,我(应该)得到counter=20。出于某种原因,每次运行循环(19,20,21)时,我都会得到不同的值,即使我使用锁访问该计数器(代码在控制台中运行): 公共静态int计数器=0; 静态对象syncObject=新对象(); 静态void Main(字符串[]参数) { 长度为10的整数; 第一个线程,第二个线程; 对于(int i=0;i您有三个问题: 您实际上运行了11次循环: 简而言之,lo
公共静态int计数器=0;
静态对象syncObject=新对象();
静态void Main(字符串[]参数)
{
长度为10的整数;
第一个线程,第二个线程;
对于(int i=0;i您有三个问题:
- 您实际上运行了11次循环:
简而言之,lock
没有什么问题,不过你最好还是使用它。你有没有看到是互锁的。Increment
?你不是在等待线程完成。你正在启动22个线程,但你从不等待它们完成。你也需要在读取计数器时使用锁。我向你保证at lock工作得很好。习惯用法的力量……我也看到了连接问题,但一直在努力解释21的输出,直到你指出@Jon,添加FirstThread.join()似乎并没有改变结果-每次运行look时都有不同的值。另外,我更喜欢避免使用Thread.Sleep(),因为循环会运行更多次(100,000),还有其他解决方案吗?@Ran:你需要加入你创建的所有线程。听起来你还没有向我们展示一些上下文……但是你真的不想创建100000个线程。我建议你使用任务并行库。但是,所有这些都超出了这个问题的范围,这就是为什么代码会这样我已经解释过了。如果还有更多的问题,我建议你问一个新问题,并附上额外的答案information@Jon,这是一个练习(某种程度上),我特别需要使用线程,我已经将循环长度缩短为10以解释错误(我的英语很糟糕),我的主要问题是:为什么每次运行循环时都会得到不同的结果?(还有,如何连接所有线程?)
public static int Counter = 0;
static object syncObject = new object();
static void Main(string[] args)
{
int ForLength = 10;
Thread FirstThread, SecondThread;
for (int i = 0; i <= ForLength; i++)
{
FirstThread = new Thread(RaiseCounter);
FirstThread.IsBackground = false;
SecondThread = new Thread(RaiseCounter);
SecondThread.IsBackground = false;
FirstThread.Start();
SecondThread.Start();
//Console.WriteLine(Counter);
}
Console.WriteLine(Counter);
Console.ReadLine();
}
public static void RaiseCounter ()
{
lock (syncObject)
{
Counter++;
}
}
for (int i = 0; i <= ForLength; i++) // i=0 to i=10 *inclusive*
lock (syncObject)
{
Console.WriteLine(Counter);
}