Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中每个对象的新线程#_C#_Multithreading - Fatal编程技术网

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()
{
    //...
}