2012-11-04 95 views
0

首先,我很抱歉,如果這個問題已經在這裏,但我的谷歌技能似乎沒有讓我失望。提升多線程和共享變量

基本上,我有一個功能,應該隨時檢查任何傳入的消息。還有一個全局變量,它應該存儲此消息。 (我在一個線程把這個功能)

我要檢查使用類似收到的消息:

while (global_array[0] != '#') { } // all messages are padded with '#' 

可悲的是,這似乎並不奏效。

我試圖使這個「global_array」波動,但那就不是我使用的,用於接收TCP的功能去。

我真的只需要這個工作..請,任何幫助,將不勝感激。

編輯:「似乎並不奏效」 - >變量似乎並沒有被改變,因爲我給堵在這個循環中

+0

爲什麼不使用屬性呢?或者你「監視」的數組不是你的代碼所擁有的? – CSharpie

+1

你可以擴展'這似乎並沒有工作'? – James

+0

使用條件在線程之間發信號表示可用,從不輪詢global_array [0] –

回答

3

當你需要某種形式的同步線程之間的通信。製作變量volatile而不是這是一種表示在不同線程之間使用此變量的方法。它所做的只是防止編譯器優化對此變量的訪問,但CPU不會從除高速緩存之外的任何位置開始讀取任何內存的內容,除非您告訴它。也就是說,使用volatile只會讓你的代碼變慢(是的,我知道在某些平臺上,編譯器實現者選擇用多線程原語掛鉤volatile,但這樣做通常被認爲是一個壞主意)。

對於你描述你想使用一個條件變量鎮守訪問你的共享數據的目的:

  1. 讀線程鎖定互斥保護併發訪問您的global_array,並一直等待條件變量直到有數據。
  2. 寫入線程鎖定互斥鎖,將數據放入其中,解鎖互斥鎖併發送條件變量。

我認爲Boost有一個封裝類似功能的類,我確信不同線程之間的通信隊列的代碼已經發布到Stackoverflow。在Google上搜索「線程通信隊列」會產生大量的鏈接以從中獲得靈感。