如何以线程安全的方式遍历容器?
|
我有一个容器(C ++),需要用两种方法在不同的线程上进行操作:1)添加和删除元素,以及2)遍历其成员。显然,在发生迭代时删除元素=灾难。代码看起来像这样:
class A
{
public:
...
void AddItem(const T& item, int index) { /*Put item into my_stuff at index*/ }
void RemoveItem(const T& item) { /*Take item out of m_stuff*/ }
const list<T>& MyStuff() { return my_stuff; } //*Hate* this, but see class C
private:
Mutex mutex; //Goes in the *Item methods, but is largely worthless in MyStuff()
list<T> my_stuff; //Just as well a vector or deque
};
extern A a; //defined in the .cpp file
class B
{
...
void SomeFunction() { ... a.RemoveItem(item); }
};
class C
{
...
void IterateOverStuff()
{
const list<T>& my_stuff(a.MyStuff());
for (list<T>::const_iterator it=my_stuff.begin(); it!=my_stuff.end(); ++it)
{
...
}
}
};
同样,B::SomeFunction()
和C::IterateOverStuff()
被异步调用。我可以使用什么数据结构来确保在迭代过程中“ 3”不受添加或删除操作的“保护”?
没有找到相关结果
已邀请:
3 个回复
疮痪徘弦漏
另一种选择是使读取器/写入器锁可公开访问,并使调用方负责正确使用该锁。但这更容易出错。
锑寝粒
悍蕾驮苇袜
棘手的部分是编写副本构造函数,这样您的互斥锁不必是递归的。或者只是使用auto_ptr。 哦,读写锁在这里确实比互斥锁更好。