在容器类中,我希望lock一个boost::mutex向量,每个向量都由一个受控实例拥有(奇怪的代码设计,但只用于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绑定的,而受控对象是同时从其他地方修改的,所以我只想在main_method的开头做一个循环的scoped_lock,以便锁定everything和asap,例如
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上使用new锁数组,并在其dtor上使用delete锁,但我想这与RAII的成语本身是背道而驰的。
我误解了什么,或者我怎么才能重构整个问题呢?
发布于 2016-09-13 07:42:49
假设您的问题是:“如何同时对多个互斥锁使用类似RAII的作用域锁?”
然后,您可以为多个锁创建自己的RAII包装器,或者使用类似于范围保护的东西。
(未经测试的伪码,但希望你知道这个想法。)
template <typename TIterator>
class multiple_lock_guard
{
private:
TIterator _begin, _end;
multiple_lock_guard(TIterator begin, TIterator end)
: _begin{begin}, _end{end}
{
for(auto it = _begin; it != _end; ++it)
{
it->_mutex.lock();
}
}
~multiple_lock_guard()
{
for(auto it = _begin; it != _end; ++it)
{
it->_mutex.unlock();
}
}
};您可以使用它如下:
void Container::desired_main_method()
{
multiple_lock_guard mlg(std::begin(_vData), std::end(_vData));
for(int i = 0; i < _vData.size(); i++)
{
this->processing(i);
}
for(int i = 0; i < _vData.size(); i++)
{
this->post_processing(i);
}
}发布于 2016-09-13 07:49:20
下面这个怎么样?
void Container::desired_main_method()
{
std::vector<boost::mutex::scoped_lock> locks;
for (int i=0; i<_vData.size(); i++)
{
locks.emplace_back(_vData.at(i)->_mutex);
}
for (int i=0; i<_vData.size(); i++)
{
this->processing(i);
}
for (int i=0; i<_vData.size(); i++)
{
this->post_processing(i);
}
}https://stackoverflow.com/questions/39464429
复制相似问题