传递对象的引用到一个新的线程(Pass reference of object to a new T

2019-06-27 21:47发布

我有一个包含双打的一个非常大的三维数组的对象,我需要开始一个新的线程需要这个阵列的数据,所以我要么需要启动一个新线程传递对象(其中包含了一大堆其他数据太)给新线程或I只是在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个线程需要使用该对象的数据。

Answer 1:

引用。

如果你改变你的线程中的数据会改变你把原来的数据。如果你改变了你的线程的线程将看到修改后的数据之外的数据同样适用。

您需要适当的锁定机制,使访问来自多个线程的数据时,也不会发生冲突。



Answer 2:

10线程? 你怎么打算维持_newObject的数据的完整性? 话说副本不会被传递,仅引用将被使用。 如果你要调用该方法的MyMethod(对象为MyObject)在10级不同的线程将MyObject的是不同的对象? 如果不是你最好refractoring的方法。

你应该还记得,一个线程就是要执行的衬垫指令集。 因此,只要使用多线程的,因为你的对象大小不会在内存增加。
多线程的非常有优势的是利用不同的线程来处理你的指示,并没有使对象的副本。



Answer 3:

假设你的MyClass的是一类,那么对象的引用只传递给新的线程,因为它是引用类型( 阅读更多MSDN上引用类型 ),我也建议大家,为了避免使用锁只需使用僵局,你能做到这一点的问题锁定关键字



Answer 4:

更准确地说它是由参考副本发送。

由于这是一个reference type ,只是一个参考在此情况下被复制,而不是所有的数据。

这就是为什么你要关心locking mechanisms在更然后1箱子thread访问这个对象指的是数据。



文章来源: Pass reference of object to a new Thread