代码
ofstream myfile("file_path");
#pragma omp parallel for default(none) schedule(dynamic) firstprivate(myfile) private(i)
for(i=0; i<10000; i++) {
myfile<<omp_get_thread_num()+100<<endl;
}
但是编译器向我显示错误:
错误:使用已删除的功能‘std :: basic_ofstream <_CharT, _Traits> :: basic_ofstream(const std :: basic_ofstream <_CharT,_Traits>&)[with _CharT = char; _Traits = std :: char_traits]’
/ usr / include / c ++ / 5 / fstream:723:7:注意:在此声明 basic_ofstream(const basic_ofstream&)= delete;
错误:未在并行中指定“ myfile”
答案 0 :(得分:3)
firstprivate
通过为值创建线程专用的副本来工作。这不适用于流,因为您无法复制它们。您不能仅通过打开文件的多个流来安全地写入文件。基本上有两种选择:
拥有一个共享流,并用#pragma omp critical
保护对它的所有线程访问。
ofstream myfile("file_path");
#pragma omp parallel for
for (int i=0; i < 10000; i++) {
#pragma omp critical
myfile << (omp_get_thread_num()+100) << endl;
}
为不同文件上的每个线程打开一个流。
#pragma omp parallel
{
ofstream myfile(std::string("file_path.") + std::to_string(omp_get_thread_num()));
#pragma omp for
for (int i=0; i < 10000; i++) {
myfile << (omp_get_thread_num()+100) << endl;
}
}