Вам нужен boost :: mutex для защиты вектора, и вы можете использовать boost :: mutex :: scoped_lock, который заблокирует мьютекс в его конструкторе и разблокирует его в деструкторе
Имейте в виду, что вам нужно использовать тот же мьютекс везде , где вы получаете доступ к этому экземпляру vec
, будь то чтение или запись.
Чтобы начать, вы можете сделать что-то вроде:
struct Worker {
boost::mutex &vec_mutex;
Worker(std::vector<double>* v,boost::mutex &v_mutex) : vec(v),vec_mutex(v_mutex) {}
void operator() {
// do some long computation and then add results to *vec, e.g.
boost::mutex::scoped_lock lock(vec_mutex);
for(std::size_t i = 0; i < vec->size(); ++i) {
(*vec)[i] += some_value;
}
}
};
Для более сложных вещей вы должны инкапсулировать вектор и мьютекс дальше, или рано или поздно вы забудете, что они должны быть подключены, и вы получите доступ к vec
где-нибудь, не удерживая блокировку, что приводит к очень трудным для отладки проблемы. Для таких задач, как этот пример, я бы предпочел, чтобы работники использовали свои собственные индивидуальные векторы и объединяли результат в управляющий поток, когда рабочие закончили.