-2
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() 时,它自己的 a 值被分配给 c。当线程到达语句ThreadPool.QueueUserWorkItem(new WaitCallback(method), d) 时,一个新线程进入 example(),并修改 c 的值。因此第一个线程也将修改后的 d 值发送到method()。结果,两个线程都打印相同的值d

要求:我希望每个线程都持有自己的 d 值,进入的第二个线程 method()不应该修改第一个线程的 d 值。我知道'lock(obj)'可以是一个选项。建议我一些在这种情况下锁定的好方法以及我可以达到我要求的其他方法。注意:考虑线程流高。

4

1 回答 1

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");
    }
}
于 2013-08-31T14:16:02.173 回答