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; }
一、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/...多線程