звучит как блокировка чтения / записи необходима. По сути, идея заключается в том, что у вас может быть 1 или более читателей ИЛИ одного писателя. Никогда нельзя блокировать чтение и запись одновременно.
РЕДАКТИРОВАТЬ: Пример использования, который, я думаю, соответствует вашему дизайну, включает внесение небольших изменений. Добавьте функцию «iterate» в класс, которому принадлежит список, и сделайте его шаблонным, чтобы вы могли передать функцию / функтор, чтобы определить, что делать для каждого узла. Примерно так (быстрый и грязный псевдокод, но вы поняли ...):
class A {
public:
...
void AddItem(const T& item, int index) {
rwlock.lock_write();
// add the item
rwlock.unlock_write();
}
void RemoveItem(const T& item) {
rwlock.lock_write();
// remove the item
rwlock.unlock_write();
}
template <class P>
void iterate_list(P pred) {
rwlock.lock_read();
std::for_each(my_stuff.begin(), my_stuff.end(), pred);
rwlock.unlock_read();
}
private:
rwlock_t rwlock;
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 read_node(const T &element) { ... }
void IterateOverStuff() {
a.iterate_list(boost::bind(&C::read_node, this));
}
};
Другим вариантом будет сделать общедоступной блокировку считывателя / записывающего устройства и поручить вызывающей стороне правильно использовать блокировку. Но это более подвержено ошибкам.