Я пытаюсь сделать my_class
потоко-безопасным, как это.
class my_class
{
const std::vector<double>&
get_data() const
{ //lock so that cannot get_data() while setting data
lock l(m_mutex);
return m_data;
}
void
run()
{
vector<double> tmp;
//some calculations on tmp.
{ //lock so that cannot get_data() while setting m_data
lock l(m_mutex);
m_data = tmp; //set the data
}
}
private:
std::vector<double> m_data;
mutex m_mutex;
my_class(); //non-copyable
}
run()
и get_data()
могут вызываться разными потоками openmp
, поэтому я ввел блокировку.(Поскольку я использую openmp, m_mutex
и lock
являются обертками RAII вокруг команд omp_init_lock();
и т. Д.).
Однако создание и уничтожение блокировки на get_data ()
обходится дорого (самая дорогая операция, когда я профилирую свой код - я часто вызываю get_data()
).
Можно ли реорганизовать my_class для удаления блокировки в get_data()
? Или это блокировка неизбежная стоимость распараллеливания кода?