Переменная ofstream не может появиться в OpenMP firstprivate? - PullRequest
0 голосов
/ 24 июня 2018

код

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" не указан при включении параллели

1 Ответ

0 голосов
/ 24 июня 2018

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;
        }
    }
    
...