g++ -std=c++11 -pthread -Wl,--no-as-needed queue.cpp
#include #include#include #include #include #include #include #include #include #include #include using namespace std; template
//模板。使得容器中的元素不限于int类型 class LockfreeList { private: std::list list; private: volatile int mutex; int lock; int unlock; public: LockfreeList() :mutex(0), lock(0), unlock(1) { } ~LockfreeList() { } void Lock() { while (!__sync_bool_compare_and_swap(&mutex, lock, 1)) { usleep(1); } } void Unlock() { //上锁后,mutex地址所指空间中 的值变成1,这里就不需要在循环判断了 __sync_bool_compare_and_swap(&mutex, unlock, 0); } void Push(T data) { //在一切用到比较交换的技术-》CAS策略的函数中,mutex地址所指空间中的值是动态变化的 Lock(); list.push_back(data); Unlock(); } T Front() { Lock(); T data = list.front(); Unlock(); return data; } void PopFront() { Lock(); list.pop_front(); Unlock(); } bool IsEmpty() { Lock(); if (list.empty()) { Unlock(); return true; } else { Unlock(); return false; } } bool Find(T data) { typename std::list ::iterator it; Lock(); for (it = list.begin(); it != list.end(); ++it) { if (*it == data) { Unlock(); return true; } } Unlock(); return false; } }; LockfreeList LF; thread_local int num = 1; //生产者 void Producer() { while(true) { num++; cout<<"num push:"< CAS策略的一些小小问题: 其实在CAS中,还有一种异常产生,也就是常说的ABA的现象。所谓ABA现象就是当前现象期望值是A,某个线程将A改为B,另外线程将B改为A,导致当前线程误以为还是原来的值,然后操作就会导致一些异常出现。
例如,偶尔会发生:



