C++ version of CopyOnWriteArrayList
C++ version of CopyOnWriteArrayList
Java 有 CopyOnWriteArrayList,它使我能够同时使用 2 个不同的线程进行迭代和变异,而无需任何外部锁定。
我们是否有任何类似的线程安全数据结构C++?
标准库中没有任何内容可以支持这一点。 鉴于C++标准容器的接口,我不确定是否可行。您必须从以下内容开始:
template <typename T>
class CopyOnWriteVector
{
boost::shared_ptr<std::vector<T> > myData;
void uniqueCopy()
{
myData = boost::shared_ptr<std::vector<T> >( new std::vector<T>( *myData ) );
}
public:
// ...
// for example...
void push_back( T const& newElement )
{
uniqueCopy();
myData->push_back( newElement );
}
// Similar for all other non-const functions.
// const functions just forward, without the call to
uniqueCopy.
};
但是,这对于将句柄返回给某些函数不起作用内部数据:迭代器或对元素的引用。 为迭代器,可以创建一个包含对它迭代到的容器的shared_ptr
,例如:
template <typename T>
class CopyOnWriteVector
{
// ...
public:
class iterator : public std::random_access_iterator_tag
{
boost::shared_ptr<std::vector<T> > myVector;
typename std::vector<T>::iterator myImpl;
public:
iterator() {} // for convenience...
iterator( boost::shared_ptr<std::vector<T> > const& vector,
typename std::vector<T>::iterator initialValue )
: myVector( vector )
, myImpl( initialValue )
{
}
// All other iterator functions forward directly to myImpl
};
};
返回引用的函数是另一个问题;你不能将引用替换为智能引用或任何类型的代理。
(注意:上面的所有代码都只是我的头顶,可能包含重大错误。 这只是为了给出你可能采取的方向的想法。
相关文章:
- 没有找到相关文章