OpenMp - обработка одного массива - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть многопоточное приложение (OpenMP), в котором каждый поток выполняет некоторые вычисления и находит значение _pre.Затем открывается файл с именем «file_pre.txt» и записывается часть строки, начиная с индексов _sub и _end.Не должно случиться, что два потока с одинаковым именем открывают файл для записи.Следовательно, часть записи, которую я написал в критическом разделе, но это дорого, потому что я хотел бы, чтобы несколько потоков с разными именами файлов могли одновременно записывать в соответствующие файлы и блокировать их только тогда, когда они имеют одинаковое значение в _pre (то же имя файла)(поток обновления может ожидать завершения других потоков).

У кого-нибудь есть решение?

ЧАСТЬ КОДА:

ofstream outfile;
#pragma omp parallel for num_threads(8) schedule(static) private(it) shared(array)
for (it = 0; it < array.size(); ++it) 
{
            int _pre, _sub = 0, _end;
             if(---)
            {        
                    _pre = xyz;
                                    _end = abc;
                                    ostringstream strCounter;
                                    strCounter << _pre;
                                    string result = "file" + strCounter.str() + ".txt";
                    #pragma omp critical(outfile)
                                        {
                                        outfile.open(result.c_str(), std::ios_base::app);
                                        if (outfile.is_open()) 
                                            {
                                            for (int count = _sub; count < _end; count++) 
                                            {
                                                outfile << buffer[count];
                                            }
                                            outfile << "\n";
                                            outfile.close();
                                           } else cout << "Unable to open file";
                                        _sub = _abc;
                    }
            }
            else
            {
                    _pre = _xyz_;
                                    _end = _abc_;
                                    ostringstream strCounter;
                                    strCounter << _pre;
                                    string result = "file" + strCounter.str() + ".txt";
                    #pragma omp critical(outfile)
                                        {
                                        outfile.open(result.c_str(), std::ios_base::app);
                                        if (outfile.is_open()) 
                                            {
                                            for (int count = _sub; count < _end; count++) 
                                            {
                                                outfile << buffer[count];
                                            }
                                            outfile << "\n";
                                            outfile.close();
                                           } else cout << "Unable to open file";
                                        _sub = _abc;
                    }

            }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...