CAS操做與無鎖隊列

  • 在多線程編程中,爲了保證內存的可見性,咱們加入了一些鎖的機制,例如信號量,互斥鎖,條件變量等等,可是鎖的機制不是一個簡單的機制,須要加入不少的控制,因此在使用中又有了一些輕量級的同步機制,例如volatile,用來防止多線程中存有緩存以及禁止對指令順序調優
  • 同時也加入了CPU的CAS操做,Compare and Swap,比較並交換,在大多數處理器架構,CAS的具體是判斷一個內存上的數據是不是所判斷的值,若是是,那麼執行修改;若是不是,那麼將不作操做並返回當前值。CAS是一種樂觀鎖,多線程執行過程當中,多個線程去修改內存中的數據,有且只有一個能修改爲功,可是失敗的線程不會中斷或者掛起。

CAS操做

int compare_and_swap (int* reg, int oldval, int newval)
{
  int old_reg_val = *reg;
  if(old_reg_val == oldval)
     *reg = newval;
  return old_reg_val;
}

具體的CAS操做

一、GCC的CAS,GCC4.1+版本中支持CAS的原子操做(完整的原子操做可參看 GCC Atomic Builtins)
1)bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
2)type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)html

二、C++11中的CAS,C++11中的STL中的atomic類的函數能夠讓你跨平臺。(完整的C++11的原子操做可參看 Atomic Operation Library)node

inline bool atomic_compare_exchange(
   _Inout_ int * _Dest,
   _Inout_ int * _Expected_value,
   int _Value
) restrict(amp);

inline bool atomic_compare_exchange(
   _Inout_ unsigned int * _Dest,
   _Inout_ unsigned int * _Expected_value,
   unsigned int _Value
) restrict(amp);

關於無鎖隊列

無鎖隊列是爲了解決在多線程環境下,多個線程使用隊列頻繁的加鎖解鎖過程,這些過程消耗了不少系統資源而CAS操做做爲一種輕量級別的同步機制,爲鎖操做帶來了很大的方便編程

void Push(void* data)
 {
    Node* old_tail;
    Node* node = new Node();
    node->data = data;
    
    do 
    {
       old_tail = tail;
 
       if (!cas(&tail, old_tail, node))
           continue
 
       if (old_tail)
          old_tail->next = node;
       else
          cas(&head, NULL, node);
 
       break;
 
    }while (1);
    
 }

這就是一種簡單的無鎖隊列的實現,而對於無鎖隊列更深層次的實現能夠類推,萬變不離其宗,本質上仍是比較在多線程運行過程當中內存是否發生了改變,若是沒有則進行插入操做。緩存

博客參考:http://www.cnblogs.com/catch/...多線程

相關文章
相關標籤/搜索