Может быть, но я думаю, что это был один из уроков, полученных на ранних этапах Java - синхронность данных обычно не на уровне функции-члена контейнера, а на один шаг выше.Вместо этого вы должны использовать объекты синхронизации, прежде чем обращаться к не поточнобезопасному списку.
Обратите внимание:
ThreadSafeQueue tsq;
tsq.push_back(...); // add lots of data
...
// Find the first element that returns true for search_criteria(elem);
auto iter = tsq.find_if(search_criteria);
// (1)
if(iter != tsq.end()) // (2)
{
tsq.erase(iter);
}
В этой поточно-ориентированной очереди все еще есть два "пробела", гдеочередь может быть изменена другим потоком.И действительно, ваш итератор может быть аннулирован этими изменениями.Теперь сравните:
Queue q;
q.push_back(...); // add lots of data
...
// Create some lock around a pre-existing mutex.
Lock lock(q_mutex);
// Find the first element that returns true for search_criteria(elem);
auto iter = q.find_if(search_criteria);
if(iter != q.end())
{
q.erase(iter);
}
// lock unlocks as it goes out of scope.
Здесь, поскольку блокировка имеет большую степень детализации, можно обеспечить согласованность всего написанного алгоритма.