template< class T>
class my_auto_ptr {
private:
T* m_ptr; //被封装的指针
public:
my_auto_ptr( T* p) :m_ptr( p ) { }
~my_auto_ptr() { delete m_ptr; }
T& operator*() { return *m_ptr;}
T* operator->() { return m_ptr;}
}
//多线程共享全局变量
shared_ptr<map> g_data;
//读请求
read() {
shared_ptr<map> data;
{
lock();
data = g_data;
unlock();
}
//查询操作
query_process(data);
}
//写请求
write() {
lock();
if (!g_data.unique())
{
shared_ptr<map> newData(new map(*g_data));
g_data.swap(newData);
}
//更新
update_process(g_data);
unlock();
}
使用 shared_ptr::unique()来判断是不是有线程在读。如果在读,那么不能直接修改,因为read()并没有全程加锁。shared_ptr::swap()把g_data 替换为新副本,此时还在锁里,不会有别的线程来读,可以放心地更新。