我有一个包含非常大的双打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个线程。
答案 0 :(得分:3)
参考。
如果更改线程中的数据,它将更改您放入的原始数据。如果更改线程外部的数据,线程将看到修改后的数据,则同样适用。
您需要适当的锁定机制,以便在从多个线程访问数据时不会发生冲突。
答案 1 :(得分:1)
更准确地说,它是由参考副本发送的。
由于这是reference type
,因此在这种情况下只复制引用,而不是所有数据。
这就是为什么在多于一个locking mechanisms
访问此对象引用的数据的情况下,您必须关心thread
。
答案 2 :(得分:1)
10个帖子?你打算如何维护_newObject的数据完整性?
如果不传递副本,则仅使用引用。
如果要在10个不同的线程中调用方法MyMethod(对象MyObject)
将MyObject作为不同的对象吗?如果不是你最好折射方法。
你还应该记住,一个线程只是一组要执行的指令。
因此,仅仅因为使用多个线程,您的对象大小不会在内存中增加。
多线程的优点是利用不同的线程来处理你的指令,而不是复制对象。
答案 3 :(得分:1)
假设你的MyClass是一个类,那么对象的引用只传递给新线程,因为它是一个引用类型(read more on reference types on MSDN),我还建议你按顺序使用一个锁避免死锁问题,只需使用lock关键字
即可