您可以將想要的任何數據傳遞給Thread.Start()
方法。這基本上是線程之間共享東西的首選方式。但是,在基本層面上,如果多個線程將訪問其他人將會訪問的內容,則需要建立某種鎖定機制以確保不存在爭用問題。
比方說,你有那是你的線程間共享全球層面的類實例:
(這是C#,但你的想法)
class GlobalData {
public string SomeProperty {get; set; }
public int SomeOtherProperty {get; set; }
}
這樣一個場景,一個多線程在同一時間訪問任何這些屬性(或期望值在呼叫間保持一致)將會遇到麻煩。所以,最簡單的方法是創建一個鎖定機構,其中線程負責:
class GlobalData {
public object Sentry = new object();
public string SomeProperty {get; set; }
public int SomeOtherProperty {get; set; }
}
在運行的線程的代碼,你會做這樣的事情(假設g_Data
是類的實例):
void SomeMethodRunningOnAThread() {
lock (g_Data.Sentry) {
// do stuff
}
}
(在VB.NET相當於lock
是SyncLock
)
這是爲了確保你不會爭用問題的最簡單方法。每個線程負責確保在訪問其內容之前嘗試鎖定對象。
除此之外,當然有辦法來解決這個問題,比如在包含全局數據的類中實現鎖定邏輯。它不會得到更難複雜,所以如果你想實現更復雜的東西,你最終必須閱讀。
這可能是一個愚蠢的問題,我可能錯過了一些簡單的東西。但是,如果創建類的新實例(g_data),其他線程將如何訪問它,因爲它們將擁有自己的g_data實例?我以爲我不得不使用像共享成員這樣的線程可以傳遞它們之間的數據? – user1402243
這裏的例子假定g_Data是一個由所有線程共享的全局實例。例如,一個類的單個全局實例。 – kprobst
謝謝kprobst,我從來沒有做過一個全局實例,看起來像我需要做一些谷歌搜索,看看我能不能找出答案。 – user1402243