【发布时间】:2015-01-03 10:14:08
【问题描述】:
我需要一些帮助来理解下面描述的代码的关键部分,特别是我如何使用std::map 是否是线程安全的。
我正在逐行加载文件,从内容中构建一个字符串,然后不时到达一个分隔符。在这个分隔符上,我创建了一个std::mapkey/value 对,并创建了一个对这个值进行操作的任务(见下文)。这个值是一对,第一个是管家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 指令,在map.insert 上使用#pragma omp critical 是否足够?每个任务都将在一个唯一键的值上运行,所以我认为我不需要做更多的事情。
提前干杯!
@Gilad 感谢您提供指向 YouTube 英特尔 OpenMP 教程的链接,
这些是特定的相关视频 -
【问题讨论】:
-
请查看 Intel youtube.com/playlist?list=PLLX-Q6B8xqZ8n8bwjGdzBJ25X2utwnoEG 提供的精彩播放列表
标签: c++ concurrency task openmp std