如何使用Intel TBB concurrent_unordered_map?编译及使用问题求助
我来帮你搞定这个问题,分编译修复和正确使用两部分来说明:
编译问题的解决方案
你当前的编译命令可能因为链接库顺序不对导致符号解析失败,g++的链接器是按顺序处理文件的,依赖库要放在源文件之后才行。另外也可以用pkg-config来自动获取TBB的编译参数,更稳妥。
正确的编译命令选其一:
- 调整链接库顺序:
g++ -std=c++11 -fopenmp concur_hash.cpp -ltbb
- 用pkg-config自动获取参数(推荐,避免手动写错):
g++ -std=c++11 -fopenmp concur_hash.cpp $(pkg-config --libs tbb)
如果还是报错,先检查代码里的拼写:你提到的tbb::concurren...应该是tbb::concurrent_unordered_map,少了个t的话编译肯定会报错。
concurrent_unordered_map的正确使用示例
给你一段完整可运行的代码,包含并行填充、查找的基本用法,适配你用OpenMP的场景:
#include <iostream> #include <vector> #include <omp.h> #include "tbb/concurrent_unordered_map.h" int main() { // 定义容器:键为int,值为std::string tbb::concurrent_unordered_map<int, std::string> concurrent_map; // OpenMP并行插入1000个元素 #pragma omp parallel for num_threads(4) for (int i = 0; i < 1000; ++i) { // 用emplace直接构造元素,比insert更高效(避免拷贝) concurrent_map.emplace(i, "value_" + std::to_string(i)); } // 验证插入结果,输出前10个元素 std::cout << "First 10 elements in concurrent map:\n"; for (int i = 0; i < 10; ++i) { auto iter = concurrent_map.find(i); if (iter != concurrent_map.end()) { std::cout << "Key: " << iter->first << ", Value: " << iter->second << "\n"; } } return 0; }
关键使用要点:
- 单个操作线程安全:
emplace、find、erase这些单个成员函数是线程安全的,多个线程可以同时调用 - 复合操作需注意:比如「先find再修改值」这种复合操作不是原子的,如果需要原子性,可以用
find_or_emplace或者自己加锁 - 迭代器风险:并发修改时,容器的迭代器可能失效,所以如果要遍历容器,最好在没有并发插入/删除的场景下进行,或者使用TBB提供的并行遍历工具
额外注意事项
- 确保你的Ubuntu系统上TBB安装正确:可以用
dpkg -l libtbb-dev确认安装状态 - C标准至少指定到C11(TBB的很多特性依赖C++11及以上)
- 如果不想用OpenMP,改用TBB自身的并行库的话,把
#pragma omp parallel for换成tbb::parallel_for,编译时去掉-fopenmp参数即可
内容的提问来源于stack exchange,提问作者letsBeePolite
相关产品推荐
相关产品推荐

