2016-03-28 7 views
0

У меня возникают проблемы со следующим фрагментом кода при использовании потоков.C++ concurrency :: concurrent_vector

Я прочитал на сайте 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(); 
     } 
    ); 
    } 
} 
+0

В какой строке есть нарушение доступа? Каковы другие темы? Можете ли вы создать [MCVE]? – Yakk

ответ

0

Не 100%, почему, но я повторно учитываться в find_if в новую функцию и четко определить мой тип итератора и это, кажется, ведет себя. Может быть, сдерживание струнного потока в лямбда было проблемой?

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; }); 

}