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