C# 使变量线程安全

C# 使变量线程安全,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,问题:当一个线程进入example()时,它自身的a值被分配给c。当该线程到达语句ThreadPool.QueueUserWorkItem(new WaitCallback(method),d)时,一个新线程进入example(),并修改c的值。因此,第一个线程还将修改后的d值发送到method()。因此,两个线程打印的d值相同 要求:我希望每个线程都保存自己的d值,输入method()的第二个线程不应该修改第一个线程的d值。我知道“锁定(obj)”可以是一个选项。请给我一些在这个场景中锁定的好

问题:当一个线程进入example()时,它自身的a值被分配给c。当该线程到达语句
ThreadPool.QueueUserWorkItem(new WaitCallback(method),d)
时,一个新线程进入example(),并修改c的值。因此,第一个线程还将修改后的d值发送到
method()
。因此,两个线程打印的
d
值相同

要求:我希望每个线程都保存自己的d值,输入
method()
的第二个线程不应该修改第一个线程的d值。我知道“锁定(obj)”可以是一个选项。请给我一些在这个场景中锁定的好方法,以及我可以实现我的需求的其他方法。
注:考虑线程流量很高。

< P>正如我告诉过你的,你所说的是假的。每个
方法将使用它接收到的值。一个小测试(我修改了您的代码,以便线程可以同时启动)


不,没有。对方法的任何调用都将具有在其
ThreadPool.QueueUserWorkItem
时存在的c值。他们不会共享一个“单一”的c值。我已经编辑了文本。请回答。@HansPassant这甚至不会编译。两个名为
c
的局部变量:(这个问题对我来说仍然没有意义。编写一个编译、运行和演示这个问题的小程序。
Public void example(int a,int b)
{
   int d=a;
   int w, c;
   ThreadPool.GetMinThreads(out w, out c);
   ThreadPool.SetMinThreads(100, c);  
   ThreadPool.QueueUserWorkItem(new WaitCallback(method), d);                    
}

Public void method(object d)
{
   console.Writeline(d);
}
using System;
using System.Threading;

class Program
{
    static ManualResetEvent mre = new ManualResetEvent(false);

    static void example(int a, int b)
    {
        int d = a;
        int w, c;
        ThreadPool.GetMinThreads(out w, out c);
        ThreadPool.SetMinThreads(100, c);
        ThreadPool.QueueUserWorkItem(new WaitCallback(method), d);
    }

    static void method(object d)
    {
        mre.WaitOne();
        Console.WriteLine(d);
    }

    static void Main(string[] args)
    {
        example(1, 2);
        example(3, 4);
        Thread.Sleep(1000);
        Console.WriteLine("The threads are still waiting after 1 sec...");
        mre.Set();
        Thread.Sleep(1000);
        Console.WriteLine("Now I hope they finished");
    }
}