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

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

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

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

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

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)
  );
}
Другие вопросы по тегам