2013-08-19 27 views
4

現在寫了複雜的class,並覺得我使用了很多CRITICAL_SECTIONCRITICAL_SECTION設置並獲得單個布爾值

據我所知,有些類型的原子操作,總是在沒有任何硬件或軟件中斷的情況下執行。

我想檢查一下是否正確理解了一切。

  • 要設置或獲取原子值,我們並不需要CRITICAL_SECTION,因爲這樣做不會有中斷。
  • bool是原子的。

所以有我的陳述,想問,如果他們是正確的,如果他們是正確的,什麼類型的變量也可以設置或得到沒有CRITICAL_SECTION

P. S.我談論獲取或設置一個單值每方法,而不是兩個,不是五個,而是一個。

+2

是否可以自動讀取/寫入/操作的類型是非常多的實現(甚至可能有編譯器選項)定義。你應該主要依靠'std :: atomic'和朋友。 – PlasmaHH

+1

我要做的唯一功能是互鎖功能 - 例如'InterlockedIncrement'等[詳見這裏](http://msdn.microsoft.com/en-us/library/ms684122(v = vs.85).aspx)。 –

+0

你會因此而陷入困境。在布爾周圍砰擊一個關鍵部分並不會完成任何事情。而std :: atomic <>不會*神奇地使一大塊代碼線程安全。線程安全需要從一開始就內置,您不能在以後添加它。 –

回答

5
  1. 您不需要鎖定輪原子數據,但內部它們可能會鎖定。請注意,例如,C++ 11的std::atomic具有is_lock_free函數。
  2. bool可能不是原子的。見herehere
1

你不能保證所有的實現/平臺/編譯器是bool,或任何其他類型的,或大部分操作,是原子的。所以,不,我不相信你的陳述是正確的。你可以重新設計你的邏輯或者使用其他方法建立原子性,但是如果你依賴它,你可能無法擺脫只用移除CRITICAL_SECTION的用法。

2

Here這可以發現:

簡單的讀取和寫入正確對齊64位變量 原子在64位Windows。讀取和寫入64位值不是 保證在32位Windows上是原子的。讀取和寫入 其他尺寸的變量不保證在任何 平臺上爲原子。

結果應該是正確的,但在編程最好不要相信應該。由於CPU高速緩存,故障的可能性依然很小。

+0

你忘記了關於32位變量的通道(前一段)。 – Medinoc

+0

@Medinoc第一句話也很重要,然而引用的語句更重要,不要認爲它是有用的做出廣泛的答案,因爲有更多的信息可能(或不可能)有用。 – ST3

4

注意:此答案適用於Windows並且沒有提及其他平臺。

沒有InterlockedRead或InterlockedWrite函數;在Windows("Simple reads and writes to properly-aligned 32-bit variables are atomic operations.")上使用正確的整數大小(和對齊)進行簡單的讀取和寫入是原子性的。

(並且沒有緩存問題,因爲正確對齊的變量總是在單個緩存行上)。

然而,讀取和修改這樣的變量(或任何其它變量)不是原子:

  • 閱讀bool?精細。測試並設置一個bool?更好地使用 InterlockedCompareExchange
  • 覆蓋整數?大!加入到 呢?關鍵部分。
+1

在Windows中,您可以使用'InterlockedXxx'輕鬆設置('InterlockedExchange')和添加('InterlockedExchangeAdd')。 –

+0

你應該說這適用於什麼架構,我認爲它不適用於ARM – paulm