首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::scoped_lock RAII行为

boost::scoped_lock RAII行为
EN

Stack Overflow用户
提问于 2016-09-13 07:29:03
回答 2查看 333关注 0票数 2

在容器类中,我希望lock一个boost::mutex向量,每个向量都由一个受控实例拥有(奇怪的代码设计,但只用于MWE )。

代码语言:javascript
复制
// 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,以便锁定everythingasap,例如

代码语言:javascript
复制
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的成语本身是背道而驰的。

我误解了什么,或者我怎么才能重构整个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-13 07:42:49

假设您的问题是:“如何同时对多个互斥锁使用类似RAII的作用域锁?”

然后,您可以为多个锁创建自己的RAII包装器,或者使用类似于范围保护的东西。

(未经测试的伪码,但希望你知道这个想法。)

代码语言:javascript
复制
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();
        }
    }
};

您可以使用它如下:

代码语言:javascript
复制
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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-09-13 07:49:20

下面这个怎么样?

代码语言:javascript
复制
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);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39464429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档