6 лет спустя, и я здесь, потому что я прочитал тот же раздел этой книги.Пример в книге, непосредственно предшествующей тому, который вы упомянули, показывает (статический). Идет выполнение в новом анонимном потоке, а затем снова отдельно в локальном контексте.
new Thread (Go).Start();
Go();
Пример в вашем вопросесначала создает экземпляр TT, а также меняет .Go с статического метода на метод экземпляра.
ThreadTest tt = new ThreadTest();
new Thread (tt.Go).Start();
tt.Go();
Так что теперь, когда .Go отправляется в новый поток для выполнения, отправляется то, что отправляется.Копия tt метода (вместо статического метода .Go), которая также выполняется локально сразу после строки 3. Поскольку оба выполнения .Go принадлежат tt, они также используют копию tt done
.Афаик, вот почему автор называет эти данные «общими», потому что теперь они могут быть доступны обоим потокам.
В сторону: я все еще не уверен в некоторых аспектах создания потоков самостоятельно.Для меня загадка - что именно происходит с tt при выполнении new Thread (tt.Go).Start();
... tt был создан в исходном потоке, но теперь он живет в обоих?Применяется ли здесь byref / byval или что-то еще происходит?Точнее сказать, что объект tt на самом деле не «жив» или «принадлежит» ни одному из потоков, а скорее находится в куче, и поэтому оба потока должны иметь к нему доступ?