С++ несколько процессов, записывающих в один и тот же файл – межпроцессный мьютекс?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 С++ несколько процессов, записывающих в один и тот же файл – межпроцессный мьютекс?

Сообщение Anonymous »

Каков наилучший (или, по крайней мере, эффективный) способ записи в файл из нескольких процессов?
Примечание: Я использую C++11 и хочу, чтобы он работал на любой платформе (т. е. только на чистом коде C++).
Я провел небольшое исследование и вот какой вывод:
  • В моих процессах используется несколько потоков. Это легко обрабатывается внутри каждого процесса с помощью мьютекса для сериализации доступа к файлу.
  • Мьютекс или условная переменная C++ не может использоваться для сериализации между процессами.
  • Мне нужен какой-то внешний семафор/файл блокировки, который будет действовать как «мьютекс», но я не знаю, как это сделать.
Я видел, как приложения используют такие вещи, как создание файла .lock во время использования. Но для множественного быстрого доступа это может не сработать (т. е. после того, как один процесс решил, что файл не существует, другой может создать его, а затем первый процесс также попытается его создать), поскольку операция проверки и создания файла не является атомарной.
Примечание: Каждый процесс всегда записывает одну целую строку за раз. Я думал, что этого может быть достаточно, чтобы сделать операцию «атомарной» (то есть целая строка будет помещена в буфер перед следующей), но это, похоже, не так (если только у меня неправильный код), поскольку я (редко) получаю искаженную строку.
Вот фрагмент кода того, как я выполняю запись (если это актуально):

Код: Выделить всё

// in c'tor
m_osFile.open("test.txt", std::fstream::out | std::fstream::app)

// in write func (std::string data)
osFile 

Подробнее здесь: [url]https://stackoverflow.com/questions/49381583/c-multiple-processes-writing-to-the-same-file-interprocess-mutex[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»