3

我有一个包含非常大的双精度 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

更准确地说,它是通过引用发送的副本

由于这是 a reference type,在这种情况下只复制一个引用,而不是所有数据。

这就是为什么在不止一个人访问此对象引用的数据locking mechanisms的情况下您必须关心的原因。thread

于 2012-09-06T11:15:29.337 回答
1

10线程?您打算如何维护 _newObject 的数据完整性?说不会传递副本,只会使用引用。如果你要在 10 个不同的线程中调用 MyMethod(object MyObject) 方法,MyObject 会是不同的对象吗?如果不是,您最好重新使用该方法。

您还应该记住,线程只是要执行的一组线性指令。因此,仅仅因为使用多个线程,您的对象大小不会在内存中增加。
多线程的优点是利用不同的线程来处理你的指令,并且不复制对象。

于 2012-09-06T11:24:17.503 回答
1

假设您的 MyClass 是一个类,那么对象的引用只传递给新线程,因为它是一个引用类型(在 MSDN 上阅读有关引用类型的更多信息),我还建议您使用锁以避免死锁问题,您只需使用lock关键字即可

于 2012-09-06T11:37:16.603 回答