C++ version of CopyOnWriteArrayList

C++ version of CopyOnWriteArrayList

本文关键字:CopyOnWriteArrayList of version C++      更新时间:2023-10-16

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
    };
};

返回引用的函数是另一个问题;你不能将引用替换为智能引用或任何类型的代理。

(注意:上面的所有代码都只是我的头顶,可能包含重大错误。 这只是为了给出你可能采取的方向的想法。

相关文章:
  • 没有找到相关文章