#include<thread>#include<iostream>#define Memory_Barrier __asm__ __volatile__("" : : : "memory")#define ACCESS_ONCE(x) (* (volatile typeof(x) *) &(x))usingnamespacestd;structHazardPointer{HazardPointer():p_(nullptr){}int*p_;//Hazard Pointer封装了原始指针};int*p=newint(2);//原始指针HazardPointer*hp=newHazardPointer();//只有一个线程可以写classWriter{public:voidretire(int*tmp){retire_list=tmp;//设置要释放的指针}voidgc(){if(retire_list==hp->p_){//说明有读者正在使用它,不能释放}else{//可以安全地释放deleteretire_list;}}voidwrite(){int*tmp=ACCESS_ONCE(p);p=nullptr;retire(tmp);gc();}private:int*retire_list;//记录待释放的指针};classReader{public:voidacquire(int*tmp){hp->p_=tmp;}voidrelease(){hp->p_=nullptr;}voidread(){int*tmp=nullptr;do{tmp=ACCESS_ONCE(p);Memory_Barrier();acquire(tmp);//封装。这是告诉Writer:我要读,别释放!}while(tmp!=ACCESS_ONCE(p));//仔细想想,为什么这里还要判断?if(nullptr!=tmp){//不妨想想,这里为什么也要判断?//it is safe to access *tmp from now oncout<<*tmp<<endl;//没问题~}//when you finish reading it, just release it .release();//其实就是告诉Writer:用完了,可以释放了。}};intmain(){threadt1(&Reader::read,Reader());threadt2(&Writer::write,Writer());t1.join();t2.join();return0;}