Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#锁不起作用/关键部分_C#_.net_Multithreading_Locking_Critical Section - Fatal编程技术网

c#锁不起作用/关键部分

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

我试图在FOR循环中使用两个不同的线程来提升一个静态(int)计数器,因此如果循环运行10次,我(应该)得到counter=20。出于某种原因,每次运行循环(19,20,21)时,我都会得到不同的值,即使我使用锁访问该计数器(代码在控制台中运行):

公共静态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);
    }