C++無鎖棧的實現
#include <atomic>
#include <string>
#include <iostream>
template<typename T>
class tg_stack
{
public:
tg_stack():_head(nullptr)
{
}
void push(const T& data)
{
node* new_node = new node(data);
new_node->next = _head.load(std::memory_order_relaxed);
while(!_head.compare_exchange_weak(new_node->next, new_node,
std::memory_order_release,
std::memory_order_relaxed));
}
bool pop(T& data)
{
auto result = _head.load(std::memory_order_relaxed);
while( result != nullptr && !_head.compare_exchange_weak(result,result->next,
std::memory_order_release,
std::memory_order_relaxed));
if( !result )
{
return false;
}
data = result->data;
delete result;
return true;
}
private:
struct node
{
T data;
node* next;
node(const T& data) : data(data), next(nullptr) {}
};
std::atomic<node*> _head;
};
struct node
{
int data;
node(const int& data) : data(data){}
};
int main()
{
tg_stack<int> st;
tg_stack<node> st2;
for (int i=0; i<10; i++)
{
st.push(i);
node jj(i);
st2.push(jj);
}
for (int i=0; i<11; i++)
{
int kk=-1;
node jj(-2);
st.pop(kk);
st2.pop(jj);
std::cout << kk << " : " <<jj.data <<std::endl;
}
return 0;
}
結果:
9 : 9
8 : 8
7 : 7
6 : 6
5 : 5
4 : 4
3 : 3
2 : 2
1 : 1
0 : 0
-1 : -2