多线程成员变量与静态变量,它们在多线程中的工作方式有何不同?

问题描述 投票:1回答:1

我对成员变量和静态变量进行了快速测试,我发现了一个有趣的结果,如果变量是静态对象的成员变量,即使在线程赛车上下文中总是正确计算,但是如果变量是静态变量,它会遇到问题。

例如:enter image description here

enter image description here

class Program
{

    static void Main(string[] args)
    {
        var locker = new object();
        ThreadPool.SetMaxThreads(64, 64);
        var numOfThreads = 64;


        WaitHandle[] waitHandles = new WaitHandle[numOfThreads];

        var sw = new Stopwatch();
        sw.Start();
        for (long i = 0; i < numOfThreads; i++)
        {
            var handle = new EventWaitHandle(false, EventResetMode.ManualReset);
            waitHandles[i] = handle;
            ThreadPool.QueueUserWorkItem((state) =>
            {

                obj.run();
                ((EventWaitHandle)handle).Set();
            }, handle);
            //obj.run();
        }
        WaitHandle.WaitAll(waitHandles);
        sw.Stop();


        Console.WriteLine($"Exit Performance test {sw.ElapsedMilliseconds} output: {obj.x}");
        Console.ReadKey();
    }
    static MyClass obj = new MyClass();
}

class MyClass
{
    private object locker = new object();
    //public static int x = 0;
    public int x = 0;
    public void run() {
        //lock (locker)
        {
            for (int j = 0; j < 10000000; j++)
            {
                x = x + 1;
            }

            Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, count of loop: {x}");
        }
        var f = 0;
        Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, $$start: {f}");
        for (int j = 0; j < 10000000; j++)
        {
            f = f + 1;
        }
        Console.WriteLine($"id: {Thread.CurrentThread.ManagedThreadId}, $$end: {f}");

    }
}

由于我理解静态对象及其成员字段在多线程共享的内存中有1个实例副本,因此它应该与使用静态varialbe相同,但不知何故它的行为有所不同。

问题:1。多线程中静态字段和成员字段之间的区别是什么? 2.这是否意味着静态字段比成员字段运行得更快?

谢谢!

c# multithreading
1个回答
-1
投票
  1. 多线程中静态字段和成员字段之间的区别是什么?我发现小循环成员字段几乎没有遇到多线程赛车问题,但是对于大循环10000000,它们都遇到了赛车问题,因此两者都需要锁定器。
  2. 这是否意味着静态字段比成员字段运行得更快?我发现使用储物柜比没有储物柜更快写入共享资源。
© www.soinside.com 2019 - 2024. All rights reserved.