У меня есть многопоточное приложение (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;
}
}
}