У меня такой вопрос: как лучше всего (или, по крайней мере, эффективно) писать в файл из нескольких процессов?
Примечание. Я использую C ++ 11 и хочу, чтобы он работал на любой платформе (т. е. только на чистом коде C ++).
Я провел небольшое исследование и пришел к выводу:
- В моих процессах у меня несколько потоков. Это легко выполняется в каждом процессе с помощью мьютекса для сериализации доступа к файлу.
- Мьютекс или условную переменную c ++ / c ++ 11 нельзя использовать для сериализации между процессами.
- Мне нужен какой-то внешний файл семафора / блокировки, чтобы действовать как «мьютекс» ... но я не уверен, как это сделать.
Я видел, как приложения при использовании используют такие вещи, как создание файла ".lock". Но для множественного быстрого доступа кажется, что это может не сработать (т.е. после того, как один процесс решил, что файл не существует, другой может его создать, а затем первый процесс также попытается создать его), потому что операция по тестированию и созданию файла не атомный.
Примечание. Каждый процесс всегда записывает одну целую строку за раз. Я думал, что этого может быть достаточно, чтобы сделать операцию «атомарной» (в том смысле, что вся строка будет буферизована перед следующей), но, похоже, это не так (если у меня нет неправильного кода), поскольку я ( редко) получается покоробленная строчка. Вот фрагмент кода, как я пишу (если это актуально):
// in c'tor
m_osFile.open("test.txt", std::fstream::out | std::fstream::app)
// in write func (std::string data)
osFile << data<< std::endl;
Это, должно быть, обычная проблема, но я еще не нашел рабочего решения для нее. Приветствуются любые фрагменты кода.