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/...多线程