C#锁定工具出错

时间:2018-11-29 16:09:43

标签: multithreading parallel-processing thread-safety locking

我尝试在Countrange方法中锁定增量器“ counter”。 计数器应在某些条件下在线程中计数。如果我按顺序(非并行)完成线程,我会一遍又一遍地获得正确的计数器值,但是当我尝试像在编程中那样锁定时,它仍然不是线程安全的,因为我在运行时会得到不同的计数器值该程序几次。

{
    class Program
    {
        static int e, p, b, m;
        static int counter = 0;
        static int lok = 0;
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            string[] inputs = input.Split(' ');
            counter = 0;
            p = Convert.ToInt32(inputs[4]);
            e = Convert.ToInt32(inputs[2]);
            b = Convert.ToInt32(inputs[1]);
            m = Convert.ToInt32(inputs[3]);
            Thread[] ts = new Thread[p];
            for (int t = 0; t < p; t++)
            {
                ts[t] = new Thread(countrange);
            }
            for (int t = 0; t < p; t++)
            {
                ts[t].Start(t);
            }
            for (int t = 0; t < p; t++)
            {
                ts[t].Join();
            }
            Console.Write(counter);
            //Console.ReadKey();
        }

        public static void countrange(object mt)
        {

            int to = eind * (((int)mt + 1) / p) + verdeler + b;
            int from = eind * (((int)mt) / p) + verdeler - a + b;

            for (int i = from; i < to; i++)
            {

                    proef = proef + moduler * keer;

                }

                {
                    if (proef % m == 0)
                        lock (mt)
                        {
                            counter++;
                        }

                }
            }


        }
    }
}

1 个答案:

答案 0 :(得分:0)

我将锁设为静态,现在可以使用