Ваша функция инициализации изменяет std :: vector без мьютекса.Это изменяет вектор в то же время, когда потоки запускаются один за другим.
Чтобы это работало, ваша функция инициализации должна выглядеть примерно так:
void init() {
for (unsigned i = 0; i < workers.size(); ++i) {
std::unique_lock<std::mutex> lock(mutex);
consumerQueues.push_back(std::make_shared<std::queue<std::string>>());
workers[i] = std::thread(&Test::consumer, this, i);
}
producerThread = std::thread(&Test::producer, this);
}
От: http://www.cplusplus.com/reference/vector/vector/push_back/
Гонки данных
Контейнер изменен.Если происходит перераспределение, все содержащиеся элементы модифицируются.В противном случае доступ к существующему элементу невозможен, и одновременный доступ к ним или их изменение безопасны.
Перераспределение происходит довольно часто, когда оно начинается с 0 элементов и достигает 1000. Таким образом, вы также можете зарезервировать размервектор, чтобы убедиться, что перераспределение не происходит:
void init() {
consumerQueues.reserve(workers.size());
for (unsigned i = 0; i < workers.size(); ++i) {
consumerQueues.push_back(std::make_shared<std::queue<std::string>>());
workers[i] = std::thread(&Test::consumer, this, i);
}
producerThread = std::thread(&Test::producer, this);
}