2009-11-27 184 views
0

線程是否有可能在同一進程中共享數據(全局變量)。C# - 多線程 - 共享數據

+0

分享如何?全局變量,共享內存或其他方法?你可能想要進一步解釋。 – 2009-11-27 03:37:55

+0

另外,我假設你是指在同一個進程中的線程,對吧? – CesarGon 2009-11-27 03:39:02

回答

2

當然是了。你只需要同步它們以避免死鎖。在C#中使用lock來標記代碼中的關鍵部分。查看MSDN瞭解詳細信息。 :-)

0

是的。可能需要更多信息。

Object o = new Object(); 
int i; // Shared variable 

lock(o) 
{ 
    // work with i. 
} 
1

相同程序中的多個線程可能共享數據。但是,您必須瞭解數據訪問和寫入的潛在問題。通常情況下,這會在編寫時讀取或嘗試訪問相同資源時出現問題。 [查看更多about race condictions]

1

是的,無論是通過引用靜態對象,公然提供跨線程的引用,還是跨線程封送(例如,UI控件調用/調度調用,儘管這不完全相同)。

雖然跨線程共享資源的同步是絕對重要的,但簡單地提倡將鎖(對象)作爲一攬子方法並不一定適用於所有情況。如果你有兩個線程被鎖定在另一個線程正在等待的共享對象上,你將會陷入僵局,因此必須考慮設計和處理流程。

除非必要,否則也不要鎖定整個類,否則可能會產生不必要的開銷並導致性能損失。對於需要同步的靜態類,最好提供一個靜態對象來鎖定與共享狀態交互的方法,而不是鎖定整個類: lock(_staticLockObjectInstance)over lock(typeof(staticClass))

1

看一看非常漂亮的postJon Skeet。即使對於穿線有點舒服的人來說,它也是一個很好的閱讀。

0

同一進程中線程的默認行爲是共享全局存儲。

如果你不想共享存儲,那麼環境提供thread local storage

如果您訪問共享存儲,那麼您可能需要使用鎖定,原子操作或內存隔離來同步對存儲的訪問。如果你忘記在代碼的任何部分這樣做,它可能會以不可預知的方式失敗。