У меня неожиданные ошибки в утверждениях в моем коде с использованием проверенной имплантации STL.
После некоторых исследований я сузил проблему до push_back в векторе, вызываемом из потока, отличного от того, в котором был создан вектор.
Простейший код для воспроизведения этой проблемы:
class SomeClass
{
private:
std::vector<int> theVector;
public:
SomeClass ()
{
theVector.push_back(1); // Ok
}
void add()
{
theVector.push_back(1); // Crash
}
};
Единственное отличие состоит в том, что SomeClass создается из моего основного потока, а add вызывается из другого потока. Тем не менее, нет никакой проблемы с параллелизмом: в простейшей форме кода, которую я использовал для устранения неполадок, никто не читает или пишет из этого вектора, кроме случаев, которые я упомянул выше.
Отслеживая код push_back, я заметил, что некоторые методы из std :: vector, такие как count () или size (), возвращают мусор при вызове из другого thred (метод "add") и корректные значения при вызове из поток создания (например, в конструкторе)
Должен ли я заключить, что std :: vector не может использоваться в многопоточной среде? Или есть решение этой проблемы?
РЕДАКТИРОВАТЬ: удалены летучие
РЕДАКТИРОВАТЬ 2: Как вы думаете, возможно, что проблема не заключается в многопоточности? В моем тестовом прогоне add вызывается только один раз (проверяется с помощью точки останова). Если я удаляю push_back из конструктора, я все равно вылетает. Таким образом, в конце концов, даже при одном вызове метода вектора функция, вызываемая один раз, делает утверждение неудачным. Следовательно, не может быть совпадения или ...?