最开始关注这个问题是在测试C++ Concurrency in Action这本书提及的几个版本stack数据结构的实现,其中lock free版本的实现时,需要精巧的内存回收机制,其中在介绍count reference内存回收机制时,作者认为shared_ptr是有reference count的指针,如果某个平台支持lock free版本的shared_ptr,可以使用它来简化count reference内存回收方式的实现。
但是我想指出的是,这个实现方式,有可能导致调用栈溢出,我当时使用4个线程向stack中push数据,4个线程从stack中pop数据,每个线程操作100万个数据,就会偶尔出现调用栈溢出的问题。
使用shared_ptr使用的lock free版本的stack代码大概如下
template<typename T>
class lock_free_stack
{
private:
struct node
{
unique_ptr<T> data;
shared_ptr<node> next;
node(const T &v) : data(new T) {}
}
shared_ptr<node> head;
public:
void push(const T &v)
{
auto new_node = make_shared<node>(v);