Как уже говорилось, контейнеры стандартной библиотеки не являются поточно-ориентированными.
Подходящим решением для этого случая является инициализация n-карт (по одной для каждого потока), а затем их объединение в конце.
Как указывалось ранее, использование мьютекса (и обеспечение безопасного доступа к карте) будет правильным решением, однако это также приведет к снижению производительности. Поскольку каждый раз, когда к карте будет осуществляться доступ, каждому потоку придется ждать, пока мьютекс разблокирует данные.
Следует отметить, что размер 10 недостаточен для того, чтобы многопоточность стоила того, поскольку использование нескольких потоков здесь, скорее всего, приведет к снижению производительности.
map<pair<int, int>, vector<int> > test[8];
#pragma omp parallel num_threads(8)
{
#pragma omp for
for (int i = 0;i < large_number; i++)
{
int thread_id = omp_get_thread_id();
test[thread_id][make_pair(i % 3, omp_get_thread_num())].push_back(i);
}
}
#pragma omp barrier
map<pair<int,int>, vector<int>> combined;
for (int i = 0; i < 8; ++i)
combined.insert(test[i].begin(), test[i].end());