C++ OpenMP与boost::directory_迭代器并行
我上面有一条代码+错误消息,我无法解决这个问题。有什么想法吗C++ OpenMP与boost::directory_迭代器并行,c++,boost,openmp,C++,Boost,Openmp,我上面有一条代码+错误消息,我无法解决这个问题。有什么想法吗 #pragma omp parallel num_threads(3) #pragma omp for for (boost::filesystem::directory_iterator itr(p_c); itr != end_itr; ++itr) { std::string outputfile = (out_p/itr->path().filename()).st
#pragma omp parallel num_threads(3)
#pragma omp for
for (boost::filesystem::directory_iterator itr(p_c); itr != end_itr; ++itr)
{
std::string outputfile = (out_p/itr->path().filename()).string();
cv::Mat image = cv::imread(itr->path().string());
ImageContainer imgc = ImageContainer(itr->path().string(), outputfile, image);
if(!imgc.Image().data)
{
std::cout << imgc.Input_Path() << " is not found." << std::endl;
continue;
}
std::cout << "Processing " << imgc.Input_Path() << std::endl;
streaks_detection(imgc);
}
不能在工作共享循环中直接使用
目录迭代器
,因为它不是随机访问迭代器。最简单的方法是将std::copy复制到st::vector
,然后在该向量上执行并行循环。或者,您可以使用锁和手动工作共享,但这更难做到正确。您不能在工作共享循环中直接使用目录迭代器,因为它不是随机访问迭代器。最简单的方法是将std::copy
复制到st::vector
,然后在该向量上执行并行循环。或者,您可以使用锁和手动工作共享,但这更难做到正确。那么为什么不简单地编写itr=p\u c
呢?您是否已经尝试过boost::filesystem::directory\u iterator itr=p\u c代码>?是的,那么错误是:错误:从'boost::filesystem::path'转换为非标量类型'boost::filesystem::directory\u iterator'(boost::filesystem::directory\u iterator itr=p\u c;itr!=end\u itr;++itr)
@koviroli实际上是什么?提供一个please.canyouputboost::filesystem::directory\u迭代器itr(p\u c)在循环之前编写>代码,然后将循环编写为for(;itr<…
?为什么不简单地编写itr=p_c
?您是否已经尝试过boost::filesystem::directory\u迭代器itr=p_c;…
?是的,那么错误是:错误:请求将“boost::filesystem::path”转换为非标量类型“boost::filesystem::directory\u迭代器”(boost::filesystem::directory_iterator itr=p_c;itr!=end_itr;++itr)
@koviroli什么是p_c
实际上?请提供一个例子。你能把boost::filesystem::directory_iterator itr(p_c);
放在循环前面,然后把循环写成for(;itr
?
.../main.cpp:248: error: parenthesized initialization is not allowed in OpenMP 'for' loop
for (boost::filesystem::directory_iterator itr(p_c); itr != end_itr; ++itr)
^