c++ - 在多线程环境中返回一个迭代器,一个好主意?

标签 c++ multithreading iterator

在多线程环境中使用和共享的对象中返回列表上的迭代器是个好主意吗?

class RequestList
{
public:
    RequestList::RequestList();
    RequestList::~RequestList();

    std::list<boost::shared_ptr<Request> >::iterator GetIterator();
    int ListSize();
    void AddItem(boost::shared_ptr<Request> request);
    void RemoveItem(boost::shared_ptr<Request> request);
    std::list<boost::shared_ptr<Request> > GetRequestsList();
    boost::shared_ptr<Request> GetRequest();

private:
    std::list<boost::shared_ptr<Request> > requests;
    std::list<boost::shared_ptr<Request> >::iterator iter;   //Iterator
    boost::mutex listmtx;
};




std::list<boost::shared_ptr<Request> >::iterator RequestList::GetIterator()
{
    return this->iter;
}

使用:

RequestList* requests;

在某些线程中(可能会在其他线程中再次使用)

 std::list<boost::shared_ptr<Request> >::iterator iter = requests->GetIterator();

或者每次只为该列表创建一个迭代器并在每个线程中本地使用它会更聪明吗?

最佳答案

不,跨线程共享迭代器通常不是一个好主意。有几种方法可以确保您不会遇到麻烦。

首先,迭代器是一种轻量级的对象,可以快速构建并且占用很少的内存。所以你不应该担心任何性能问题。只需在需要时创建一个实例即可。

也就是说,您必须确保在迭代时您的列表没有被更改。我看到你的类(class)里有一个 boost::mutex。锁定将非常适合确保您在迭代时不会遇到任何问题。

处理这些情况的另一种同样有效的方法是简单地复制内部列表并对其进行迭代。如果您需要不断更新列表并且不希望其他线程等待,这是一个很好的解决方案。当然它会占用更多的内存,但由于您存储的是智能指针,因此它几乎不会占用任何内存。

关于c++ - 在多线程环境中返回一个迭代器,一个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3906045/

相关文章:

c# - 获取和设置简单的静态属性线程安全吗?

java - 多线程最佳实践: constraining tasks newFixedThreadPool

java - 迭代器上的迭代等递归逻辑

javascript - 从 Iterator mediator esb wso2 获取 SUM

c++ - 类函数[C++]调用不属于任何类的函数

c++ - 以下函数的时间复杂度是多少?

c++ - 同时运行两个程序

c++ - 通过不同的容器修改std容器的内容

c++ - 以不同于 Visual C++ 中的其他关键字的方式突出显示基本类型

c++ - 如何将相互依赖的对象 move 在一起并维护内部引用