2012-05-18 134 views
1

我是一個業餘愛好者,至少可以說,但我已經提出了一些基本的程序。無論如何,我正在製作一臺DVD機器人。硬件方面已經建成,並通過串口工作良好。爲了使這件事情起作用,我將不得不製作一個多線程應用程序,我的第一個。線程間共享信息

該應用將需要至少4個線程。 2個用於2個DVD刻錄機,一個用於機器人控制,另一個用於指導其他3個線程應該做什麼。

我的問題是什麼是這些線程之間共享數據的最佳方式。我一直在四處尋找共享類和線程鎖,但我感覺我可能會過度複雜化。我知道我可以使用數據庫來傳遞數據,並讓每個線程每隔幾秒檢查一次數據庫,但這對我來說並不像想要做到這一點的正確方式。

感謝您的意見。

回答

3

您可以將想要的任何數據傳遞給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相當於lockSyncLock

這是爲了確保你不會爭用問題的最簡單方法。每個線程負責確保在訪問其內容之前嘗試鎖定對象。

除此之外,當然有辦法來解決這個問題,比如在包含全局數據的類中實現鎖定邏輯。它不會得到更難複雜,所以如果你想實現更復雜的東西,你最終必須閱讀。

+0

這可能是一個愚蠢的問題,我可能錯過了一些簡單的東西。但是,如果創建類的新實例(g_data),其他線程將如何訪問它,因爲它們將擁有自己的g_data實例?我以爲我不得不使用像共享成員這樣的線程可以傳遞它們之間的數據? – user1402243

+0

這裏的例子假定g_Data是一個由所有線程共享的全局實例。例如,一個類的單個全局實例。 – kprobst

+0

謝謝kprobst,我從來沒有做過一個全局實例,看起來像我需要做一些谷歌搜索,看看我能不能找出答案。 – user1402243