使变量线程安全

时间:2013-08-31 13:38:44

标签: c# multithreading thread-safety

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);
}

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

要求:我希望每个线程都拥有自己的d值,进入method()的第二个线程不应该修改d的第一个线程值。我知道'lock(obj)'可以是一个选项。请告诉我一些锁定这种情况的好方法,以及我可以通过其他方式实现我的要求。 注意:请考虑线程流高。

1 个答案:

答案 0 :(得分:1)

正如我告诉你的那样,你说的是假的。每个method将使用它收到的值。一点点测试(我已经修改了你的代码,以便线程可以同时启动)

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");
    }
}
相关问题