我需要一些幫助來理解下面描述的代碼的關鍵部分,特別是我如何使用std::map
是線程安全的。C++ - OpenMP任務 - 地圖插入,關鍵?
我一行一行地加載一個文件,從內容中構建一個字符串,然後每隔一段時間到達一個分隔符。在此分隔符上,我創建一個std::map
鍵/值對,並創建一個任務以對此值進行操作(請參見下文)。這個值是一對,第一個是管家int
,第二個是uint64_t
的矢量。
#pragma omp parallel num_threads(4)
#pragma omp single
{
while (getline(fin, line) && ...)
{
if (line[0] == '>')
{
#pragma omp task
do_work_on_value(tmp, map[key])
tmp.clear();
// insert map entry (new key!)
map.insert(...);
}
else
tmp += line;
}
}
...
static void do_work_on_value(string vals, pair<int, vector<uint64_t>> &val)
{
...
}
所以,關鍵的操作是:
- 添加新的鍵/值對,而在不同的值
- 上的值的矢量(
push_back
和一些算術/按位上的工作運行內容)
我使用this answer瞭解了一些OpenMP指令,是否足夠使用#pragma omp critical
在map.insert
?每項任務將以獨特的鑰匙價值運作,所以我不相信我需要做更多。
提前歡呼!
@Gilad感謝你的鏈接到YouTube的英特爾OpenMP的教程,
這些都是具體的相關視頻 -
Introduction to tasks and examples
Discussion of tasks in linked list example
請檢查這個偉大的播放列表由英特爾https://www.youtube.com/playlist?list=PLLX-Q6B8xqZ8n8bwjGdzBJ25X2utwnoEG – Gilad