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)'可以是一个选项。请告诉我一些锁定这种情况的好方法,以及我可以通过其他方式实现我的要求。
注意:请考虑线程流高。
答案 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");
}
}