3

double の非常に大きな 3D 配列を含むオブジェクトがあり、この配列のデータを必要とする新しいスレッドを開始する必要があるため、オブジェクトを渡す新しいスレッドを開始する必要があります他のデータも) 新しいスレッドに渡すか、3D 配列を新しいスレッドに渡すだけです。最初の解決策として、次のことを行うだけです。

MyClass
{
    ...
    public double[,,] _data = new double[x,y,z];
    ...
}

MyMethod(object MyObject)
{
    //do stuff with (MyObject as MyClass)
}

MyClass _newObject = new MyClass();

Thread thread = new Thread(new ParameterizedThreadStart(MyMethod));
thread.Start(_newObject);

私の質問: オブジェクト_newObjectを新しいスレッドに渡すと、そのオブジェクトは参照によってスレッドに送信されますか、それともオブジェクトがコピーされ、そのコピーが新しいスレッドによって使用されますか? 問題は、オブジェクトに約 300MB のデータが含まれていることです。そのオブジェクトのデータを使用する必要がある約 10 のスレッドを開始する必要があるため、コピーを使用する場合はほとんど不可能です。

4

4 に答える 4

4

参考までに。

スレッド内のデータを変更すると、入力した元のデータが変更されます。スレッドの外でデータを変更した場合も、変更されたデータがスレッドに表示されます。

複数のスレッドからデータにアクセスするときに衝突しないように、適切なロック メカニズムが必要です。

于 2012-09-06T11:25:44.630 に答える
1

MyClass がクラスであると仮定すると、オブジェクトの参照は新しいスレッドにのみ渡されます。これは参照型であるためです ( MSDN の参照型の詳細を参照)。回避するためにロックを使用することもお勧めします。lockキーワードを使用するだけでデッドロックの問題を解決できます

于 2012-09-06T11:37:16.603 に答える
1

より正確には、 send by reference copyです。

これは であるため、この場合は参照reference typeのみがコピーされ、すべてのデータはコピーされません。

そのため、このオブジェクトが参照するデータlocking mechanismsに複数のアクセスがある場合に注意する必要があります。thread

于 2012-09-06T11:15:29.337 に答える
1

10スレッド? _newObject のデータの整合性をどのように維持する予定ですか? コピーは渡さないと言って、参照のみが使用されます。メソッド MyMethod(object MyObject) を 10 個の異なるスレッドで呼び出す場合、MyObject は異なるオブジェクトになりますか?? そうでない場合は、メソッドを屈折させたほうがよいでしょう。

また、スレッドは実行される一連の命令の単なるライナーであることを覚えておく必要があります。したがって、複数のスレッドを使用するという理由だけで、オブジェクトのサイズがメモリ内で増加することはありません。
マルチスレッドの利点は、異なるスレッドを使用して命令を処理できることであり、オブジェクトのコピーを作成しません。

于 2012-09-06T11:24:17.503 に答える