C# C中每个对象的新线程#
我有以下代码:C# C中每个对象的新线程#,c#,multithreading,C#,Multithreading,我有以下代码: Thread[] threadArray= new Thread[3]; MyObject[] objectArray = new MyObject[3]; for (int i = 0; i < 3; i++) { //Create new HotelSupplier object objectArray[i] = new MyObject(); //Create array of threads and start a
Thread[] threadArray= new Thread[3];
MyObject[] objectArray = new MyObject[3];
for (int i = 0; i < 3; i++)
{
//Create new HotelSupplier object
objectArray[i] = new MyObject();
//Create array of threads and start a new thread for each HotelSupplier
threadArray[i] = new Thread(new ThreadStart(objectArray[i].run));
//Store the name of the thread
threadArray[i].Name = i.ToString();
//Start the thread
threadArray[i].Start();
}
我的输出:
GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041
我希望有3个不同的随机数,而不是一个,因为我认为每个线程运行在不同的对象上
关于线程,我做错了什么?我不理解什么?您的原始代码导致所有
随机
实例都使用相同的值进行种子设定
修复此问题的最低影响方法是移动代码以创建随机
:
void Run()
{
//...
Random random = new Random();
//...
}
在Run
方法之外,并进入private static
变量,因此它变为:
private static Random random = new Random();
void Run()
{
//...
}
因此,它只在
MyObject
的所有实例中播种一次,这是因为使用当前时间播种Random,但时间分辨率通常仅为15ms。换句话说,三个随机生成器都在相同的15毫秒帧内初始化的几率非常高,它们都有相同的种子,因此都会产生相同的值
我建议您在初始线程上创建第一个随机生成器,生成三个随机值,并将它们用作其他线程生成器的种子。尝试传入RNG实例,而不是创建一个新实例。您刚刚遇到了一个非常常见的问题,您看到的症状与线程无关。在每个线程中创建的
Random
将以相同的(基于时间的)值作为种子。提取它,这样它只会被播种一次。而且,正如目前所说的,这听起来不像是线程的一个很好的用途。创建线程的开销很可能会缩短生成随机值的时间。此外,从不同线程写入控制台意味着同步,这限制了并行性的水平。谢谢,这解决了我的问题。很高兴知道这与我的线程无关。我会尽快接受这个答案。如果你使用一个共享的随机发生器,你必须用锁来保护它,以避免比赛条件。
private static Random random = new Random();
void Run()
{
//...
}