Stl контейнер вектор push_back с многопоточностью OpenMP - PullRequest
0 голосов
/ 16 августа 2011

Я хочу 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 Ответ

4 голосов
/ 18 августа 2011

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

Вы должны сделать 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)
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...