Thursday, December 08, 2011

線程同步機制小結 1 – Atomic Operation


資料來源: 辛望的開發日誌
線程同步機制有很多種,從概念上大概可以分為以下幾種:
  1. Atomic Operation
  2. Mutex
  3. Spinlock
  4. Condition
  5. Read/Write Lock
  6. Semaphore
這些概念在不同的平台上有不同的實現,某些平台缺少某些概念,如 Java 在 1.5 前沒有 Atomic Operation 和 Semaphore;某些平台將多個概念混合在一個 API 中,如 Win32 的 CriticalSection 混合了 Mutex 和 Spinlock;某些平台在這些概念的基礎上又提出(構建)了一些新的概念。下面對每種概念在每個平台上的實現做一個總結。
1. Atomic Operation
所謂原子操作指的是不會被打斷的操作,一般來說一個原子操作對應一個特殊的 CPU 指令。在所有的線程同步機制裡原子操作是最迅速的,因為完全不需要加鎖。原子操作是實現 Lock-Free 最重要的武器。原子操作中除了常見操作,如「加、減、與、或、非、賦值」操作等,常見的還有 Compare-and-Swap, Test-and-Set, Add/Sub-and-Get 等組合操作。
Java 5 裡新加入的 Concurrent API 包含了一系列的 AtomicXXX 的類。實際上這些類只做了兩件事情:1. 封裝一個 volatile 修飾的變量來保證一般操作(加、減、賦值)是原子的;2. 通過調用系統相關的 API 來實現組合操作。Java 的 volatile 會保證對變量的操作是原子性的,這和 C/C++ 中的 volatile 有很大不同。
在 GCC 中原子操作需要通過特殊的內建函數來實現,參見:http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Atomic-Builtins.html
Microsoft 將原子操作叫做 Interlocked Operation,參見:http://msdn.microsoft.com/en-us/library/aa911383.aspx。.Net 裡提供的 API 其實就是這些函數的簡單封裝,畢竟 CLR 的 Thread 就是 Win32 的 Thread。
C++ 0x 標準裡也包括了一些列的 Atomic 操作,這裡就不詳細給出。

No comments: