在多线程环境中使用和共享的对象中返回列表上的迭代器是个好主意吗?
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/