使用OpenMP处理unordered_map时出现错误。在for循环中,我正在寻找元素,如果它们存在,我将对其进行更新,否则将创建它们。
我将它与OpenMP并行化,并且出现double free or corruption
错误。
我做了一个简单的例子:
#include <cstdlib>
#include <iostream>
#include <string>
#include <unordered_map>
#include <omp.h>
int main() {
std::unordered_map<int, std::string> myMap;
std::unordered_map<int, std::string>::iterator it;
std::string myStr("Test");
int i;
for (i=0 ; i<20 ; ++i) {
myMap.insert({i, myStr});
}
#pragma omp parallel default(none) \
private(it) \
shared(myMap, myStr)
{
#pragma omp for
for (i=0 ; i<100 ; ++i) {
if ((it=myMap.find(i))==myMap.end()) {
// Create the element
myMap.insert({i, myStr});
}
else {
// Update the element
}
}
// std::cout << omp_get_num_threads() << std::endl;
}
return EXIT_SUCCESS;
}
此示例不会始终重现该错误。请确保运行几次,然后告诉我一切正常。
当我在Gdb中运行我的真实代码时,它告诉我错误来自find
或insert
。