2016-06-22 40 views
1

我有以下情況。我有一個寫入數組的線程。 寫入該數組後,我需要讀取該數組。讀發生在寫入數組後,我可以通過另一種方式保證(這意味着我不需要條件變量,但只是在讀取數組中的「刷新」內容時)。該數組稍後將從另一個線程讀取。從另一個線程寫入陣列中獲取數據

編輯:此外,寫作將發生在不同的時間,數組不是一次寫入。

我需要讀取數組的全部內容,其中所有條目已經刷新並且與讀取時的實際值一致。現在值不刷新。

什麼是同步這個最好的方法?

  • mutex?
  • atomic?
  • 柵欄?

我不知道我該怎麼做。我知道一個變量就足夠了,但這是一個數組。我不確定正確的做法是什麼。 我不知道該怎麼做:鎖?

+0

如果您確定不再需要對陣列進行寫操作,則根本不需要同步。多個閱讀器不需要保護。 –

+0

沒有更多的寫入操作會完成,但是我沒有看到讀取器線程更新的數據,所以我假設我缺少一些同步。 –

+0

爲了簡單起見,我建議你使用'mutex'。開始在數組中寫入時鎖定,完成時解鎖,讀取數組時相同。 – chema989

回答

1

如果我正確地理解了這個問題,那麼您知道在另一個線程更改了該值之後您會讀取一些值,但是您沒有看到該更改。

事實上,不保證您的閱讀線程將讀取寫入線程的更新值,而無需某種同步機制(您可以閱讀更多here)。

,將工作一個解決方案是使用原子變量,例如,如果你有int數組,將其更改爲原子

std::atomic<int> arr[4]; 
+0

我的數組看起來更像這個std :: array 。我認爲這會有所作爲。我還不確定哪一種是同步數據的最佳方法,但是如果互斥體可以做,我應該這樣做。 –

+0

那麼,std :: array比c風格的數組要好得多,但它的工作原理是一樣的。使用atomic的解決方案很好,因爲它可以不鎖定地工作,有點像java中的volatile。 – gbehar

+0

不,我的意思是我不能有一個std :: atomic 。這是否準確? –

2

陣列有一個根本性的問題,一個陣列不能被寫入自動閱讀和閱讀。不阻擋作者和讀者可以競賽,以便讀者可以觀察到部分更新的陣列。

一種解決方案是使用單生產者單用戶環形緩衝區,元素是指向這些數組的指針。通過這種方式,作者和讀者不會競相寫入/讀取相同的數組,並且讀者只會觀察到一致的數據。

相關問題