Потокобезопасен ли класс std::vector ?
От: Павел Кузнецов  
Дата: 01.04.04 05:47
Оценка: 6 (1)
#Имя: FAQ.cpp.stl.vector.multithread
A>В МСДНе не понятно написано

Класс или шаблон, аналогичный std::vector по интерфейсу, сделать "потокобезопасным" сам по себе невозможно по принципиальным соображениям. Например:
void f(std::vector<int>& v)
{
  std::size_t sz = v.size();
  for (std::size_t i = 0; i < sz; ++i)
    std::cout << v[[i];
}

Вне зависимости от степени "потокобезопасности" std::vector, без дополнительной синхронизации, функция f не будет "потокобезопасной", если есть хотя бы один поток, который может модифицировать v одновременно с выполнением f. В самом деле: если после получения v.size() другой поток, например, уменьшит размер вектора, то произойдет обращение к "чужой" памяти.

Никак, кроме "нормальной", внешней по отношению к std::vector, синхронизации, это не "лечится".

--
Павел Кузнецов
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.