C# 使变量线程安全
问题:当一个线程进入example()时,它自身的a值被分配给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)”可以是一个选项。请给我一些在这个场景中锁定的好
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");
}
}