【发布时间】:2016-09-13 07:29:03
【问题描述】:
从一个 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 是 cpu-bound 并且 受控 对象同时从其他地方修改,我想简单地在 @987654326 的开头做一个循环的 scoped_lock @,为了锁定一切和尽快,比如
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 循环结束后,锁定将很快超出范围。
我尝试在 Container ctor 上 new 一组锁,并在其 dtor 上 delete 它,但我想这违反了 RAII 习语本身。
我误解了什么,或者我该如何重构整个问题?
【问题讨论】:
标签: c++ boost scope mutex scoped-lock