C ++ concurrency :: concurrent_vector

时间:2016-03-28 14:42:44

标签: c++ multithreading c++11 ppl

使用线程时,我遇到以下代码问题。

我在Microsoft网站上看​​到,附加到concurrent_vector并没有弄乱迭代器,所以我没有在mutex操作的持续时间内提供find_if

所以我收到的错误是“访问违规”

我有6个并发运行的线程。我应该用mutex包裹吗?它需要一个吗?我对C ++很新。

std::stringstream key;
key << "SearchString " << ID << ", " << "Options" << ", " << Date;

auto &it = std::find_if(
  m_spList.begin(), m_spList.end(),
  [&key] (std::unique_ptr<IBaseObject>const &bo){
    return bo->ID() == key.str();
  }
);

if (it != m_spList.end()) {
  while (it != m_spList.end()) {
    ReplacePartResult* rpr = dynamic_cast<ReplacePartResult*>(it->get());

    if (rpr) {
      if (rpr->ReplaceItem) {
        replaceBOMID = rpr->BOMID > 0 ? rpr->BOMID : 0;

        if (_parentPart) {
          _parentPart->TemplateBomID = rpr->BOMID;
          _parentPart->Name = rpr->Name;
          _parentPart->Description = rpr->Description;
        }
      }
    }
    it = std::find_if(
      ++it, m_spList.end(),
      [&key](std::unique_ptr<IBaseObject>const &bo){
        return bo->ID() == key.str();
      }
    );
  }
}

1 个答案:

答案 0 :(得分:0)

不是100%为什么,但我将find_if重新考虑到一个新函数中,并明确定义了我的迭代器类型,它似乎表现得很好。也许将字符串流连接到lambda是个问题吗?

concurrency::concurrent_vector<std::unique_ptr<IBaseObject>>::iterator IBaseObject_FindKey(concurrency::concurrent_vector<std::unique_ptr<IBaseObject>>& mv, std::string const& _key)
{
    return std::find_if(std::begin(mv), std::end(mv), [&_key](std::unique_ptr<IBaseObject>const &bo){return bo->ID() == _key; });

}