C#创建公共实例

问题描述:

我的问题是为什么这行 - ThreadTest tt = new ThreadTest();在下面的例子中创建一个公共实例,而不是一个单独的实例。请指教,谢谢!C#创建公共实例

class ThreadTest 
{ 
    bool done; 

    static void Main() 
    { 
    ThreadTest tt = new ThreadTest(); // Create a common instance 
    new Thread (tt.Go).Start(); 
    tt.Go(); 
    } 

    // Note that Go is now an instance method 
    void Go() 
    { 
    if (!done) { done = true; Console.WriteLine ("Done"); } 
    } 
} 

编辑: 的示例是从http://www.albahari.com/threading/#_Introduction,其演示了如何线程之间共享数据。

EDIT2: 我的问题就是为什么“的实例是常见的两种线程”

+0

什么是'ThreadTest'?我在框架中找不到这样的类。 – Bobby 2010-08-30 09:53:18

+0

@Bobby:嗯,问题中的代码声明了它。 – Timwi 2010-08-30 09:54:09

+0

@Timwi:Doh,我是个白痴。 – Bobby 2010-08-30 09:56:51

目前还不清楚你所说的“共同实例”的意思,但构造绝对创建一个新的实例。 Go方法执行两次,一次在新线程中,一次在主线程中执行。

也许什么代码作者的意思是,实例是常见的两个线程,因为两个线程调用同一实例Go方法。

Go方法的内部存在竞争条件。它可能无法预料地打印两次“完成”。

+0

你的猜测是正确的。然而,我的问题正是为什么“这个实例对两个线程都是共同的”。 – Stan 2010-08-30 09:59:45

+0

因为您只创建一个并使用它两次。 – Timwi 2010-08-30 10:10:06

+0

啊,我以为它就像 new Thread(tt.Go).Start(); Go(); – Stan 2010-08-30 10:12:36

如果您的意思是这两个调用tt.Go共享'完成'变量,那当然会发生。你在同一个对象上调用一个方法,只是在主线程中发生,而另一个发生在单独的线程中。

你永远只能创建ThreadTest的一个实例,但叫去了两次,所以两个调用具有相同的对象上发生!

6年后,我在这里,因为我读了这本书的同一部分。在你刚刚提到的那本书之前的书中的例子显示了(静态的).Go在一个匿名的新线程上执行,然后在本地上下文中单独执行。

new Thread (Go).Start(); 
Go(); 

的例子在你的问题首先创建TT的实例,也从一个静态方法实例方法改变。去。

ThreadTest tt = new ThreadTest(); 
new Thread (tt.Go).Start(); 
tt.Go(); 

所以现在。去的时候被送到执行新的线程,结果收到了送什么方法TT的拷贝(而不是静态的。去的方法),这也是得到了什么之后立即在本地执行因为.Go的两个执行都属于tt,所以他们也使用tt的副本done。 Afaik,这就是为什么作者将这个数据称为“通用”,因为它现在可以被两个线程访问。另外:我仍然在自己的几个方面摇摆不定。我的一个谜团是什么时候执行new Thread (tt.Go).Start(); ...... tt是在初始线程中实例化的,但它现在同时存在于两者中? byref/byval在这里适用还是其他事情正在进行?是否更准确地说,tt对象实际上不是“活着”或“属于”任何线程,而是堆,因此两个线程都应该可以访问它?

+2

对于程序员来说,对象所有权对于技术来说更为合理。该对象存在(生命)在堆上,没有“所有者”。它是共享的,因为在向新线程传递'tt.Go'时,它会捕获'tt'实例,所以新线程引用'tt'确保它保持活动状态;主线程也有对'tt'的引用。实际上,这提供了共享数据。对象在任何引用存在时都会存活 - 哪个线程或哪个线程无关紧要。 – MicroVirus 2016-06-11 00:46:25