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

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

Сообщение Anonymous »

Мой вопрос таков: каков наилучший (или, по крайней мере, эффективный) способ записи в файл из нескольких процессов?

Примечание: Я использую 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 

Подробнее здесь: [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++»