Из класса Container я хотел бы lock
создать вектор boost::mutex
, каждый из которых принадлежит экземпляру Controlled (странный дизайн кода, но только для целей MWE).
// std::vector<Controlled*> _vData;
void Container::main_method()
{
for (int i=0; i<_vData.size(); i++)
{
boost::mutex::scoped_lock my_lock(_vData.at(i)->_mutex);
this->processing(i);
}
// precondition for post_processing(): all processing() calls done
for (int i=0; i<_vData.size(); i++)
{
boost::mutex::scoped_lock my_lock(_vData.at(i)->_mutex);
this->post_processing(i);
}
}
Но поскольку processing
привязан к процессору, а управляемые объекты тем временем изменяются откуда-то еще, я хотел бы просто выполнить циклический scoped_lock
в начале main_method
, чтобы заблокировать все и как можно скорее, например
void Container::desired_main_method()
{
for (int i=0; i<_vData.size(); i++)
{
boost::mutex::scoped_lock my_lock(_vData.at(i)->_mutex);
}
// locks destroyed here, aren't they ?
for (int i=0; i<_vData.size(); i++)
{
this->processing(i);
}
for (int i=0; i<_vData.size(); i++)
{
this->post_processing(i);
}
}
Проблема в том, что если я хорошо понял идиому RAII и контекст scoped_lock
, то таким образом блокировки выйдут из области действия вскоре после окончания цикла блокировки for
.
Я пытался new
массив блокировок в Container ctor и delete
на его dtor, но я думаю, что это противоречит самой идиоме RAII.
Что я неправильно понял или как я мог реорганизовать всю проблему?