我很想了解 COW 的工作原理,我在 wikibooks 上找到了以下课程,但我不理解这段代码。
template <class T>
class CowPtr
{
public:
typedef boost::shared_ptr<T> RefPtr;
private:
RefPtr m_sp;
void detach()
{
T* tmp = m_sp.get();
if( !( tmp == 0 || m_sp.unique() ) ) {
m_sp = RefPtr( new T( *tmp ) );
}
}
public:
CowPtr(T* t)
: m_sp(t)
{}
CowPtr(const RefPtr& refptr)
: m_sp(refptr)
{}
CowPtr(const CowPtr& cowptr)
: m_sp(cowptr.m_sp)
{}
CowPtr& operator=(const CowPtr& rhs)
{
m_sp = rhs.m_sp; // no need to check for self-assignment with boost::shared_ptr
return *this;
}
const T& operator*() const
{
return *m_sp;
}
T& operator*()
{
detach();
return *m_sp;
}
const T* operator->() const
{
return m_sp.operator->();
}
T* operator->()
{
detach();
return m_sp.operator->();
}
};
我会在共享的地图对象上的多线程应用程序中使用它。
map<unsigned int, LPOBJECT> map;
所以我已经将它分配给模板,现在我有:
CowPtr<map<unsigned int, LPOBJECT>> map;
现在我的问题:
我应该如何正确地为只想读取地图对象的随机线程获取地图实例?
例如,我应该如何从随机线程修改地图对象。插入新对象还是删除它?