Вектор контейнера Stl push_back с многопоточностью OpenMP

Я хочу вставить объект в вектор из разных потоков. Нет. ниток зависит от машины.

#pragma omp parallel shared(Spaces, LookUpTable) private(LutDistribution, tid)
{
    tid = omp_get_thread_num();

    BestCoreSpaces.push_back( computeBestCoreSpace(tid, &Spaces, &LookUpTable, LutDistribution));
}

Проблема в том, что я не уверен, что это работает. У меня не бывает сбоев. Я использую опенМП. OpenMP ставит что-то в очередь? Возможно, достаточно зарезервировать память для контейнера с помощью BestCoreSpaces.reserve(tid) или назначить количество элементов с помощью BestCoreSpaces.assign(tid, Space). Кто-нибудь может мне помочь?


person Florian    schedule 16.08.2011    source источник


Ответы (1)


Вам просто это сойдет с рук - у вас есть состояние гонки, которое может проявляться или не проявляться в зависимости от уровня оптимизации во время компиляции, выполнения потока и/или выравнивания звезд.

Вы должны сделать push_back() критическим разделом (т.е. использовать мьютекс). Например:

#pragma omp parallel shared(Spaces, LookUpTable, BestCoreSpaces) private(LutDistribution, tid)
{
  tid = omp_get_thread_num();
#pragma omp critical
  BestCoreSpaces.push_back( 
    computeBestCoreSpace(tid, &Spaces, &LookUpTable, LutDistribution)
  );
}
person ipapadop    schedule 17.08.2011