将对象的引用传递给新的Thread

我有一个包含非常大的双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个线程。

引用。

如果更改线程中的数据,它将更改您放入的原始数据。如果更改线程外部的数据,线程将看到修改后的数据,则同样适用。

您需要适当的锁定机制,以便在从多个线程访问数据时不会发生冲突。

10个线程? 你打算如何维护_newObject的数据完整性? 如果不传递副本,则仅使用参考。 如果要在10个不同的线程中调用方法MyMethod(对象MyObject),MyObject将成为不同的对象吗? 如果不是你最好折射方法。

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

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

更准确地说,它是通过参考副本发送的。

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

这就是为什么在多个thread访问此对象引用的数据的情况下,您必须关心locking mechanisms