我有一個std::map
,其中的密鑰與thread_num相同。每個線程都寫入該值,這裏是std::vector
。因此保證每個線程僅在「他的」std::vector
上運行。OpenMP:同時寫入std :: map
實施例:
#include <iostream>
#include <omp.h>
#include <map>
#include <vector>
int main(void) {
std::map<unsigned int, std::vector<unsigned int> > M;
// initialize map using first touch policy:
#pragma omp parallel for schedule(static,1)
for (int i=0; i<omp_get_num_procs(); ++i) {
#pragma omp critical
M[omp_get_thread_num()] = std::vector<unsigned int>();
}
// do some parallel operations:
#pragma omp parallel for schedule(static)
for (int i=0; i<100; ++i) {
M[omp_get_thread_num()].push_back(i);
}
// disp the content:
for (auto it_key : M) {
std::cout << "thread " << it_key.first << " : {";
for (auto it_vec : it_key.second) {
std::cout << it_vec << " ";
}
std::cout << "\b \b}" << std::endl;
}
return 0;
}
輸出看起來如需要的話。問題是上述代碼是否合法?所以我可以得出結論,我可以並行操作std::map
,只要我能保證只有一個線程在特定鍵的輔助數據上運行?
我不明白你的第一個循環,沒有意義的並行運行它,因爲地圖會按順序存儲所有內容。除此之外,你的第二回合看起來合法。 – SirGuy
@GuyGreer好吧,第一個循環可能是不必要的複雜。這個想法是,在矢量上運行的線程應該自己創建線程(ccNUMA局部性,第一次觸摸)。重要的是,密鑰必須事先初始化。 –