Является ли атом атомарным?

Простой вопрос:

Мне нужно добавить некоторые записи в мою программу.

Если два процесса используют "fwrite" в одном файле, но не один и тот же дескриптор файла, то записанные сообщения журнала будут атомарными или смешанными. Есть ли предел длины?

Определено ли определение или реализация ANSI-C? Если позже, что на MacOSX, Linux и Windows MSVC?

Ответ 1

Он может быть смешанным.

Если у вас более одного потока/процесса записи в один файл, вам нужно использовать блокировку.

Альтернативой является отправка сообщений журнала в выделенный сервис/поток. Отличным инструментом для принятия является syslog, который, безусловно, установлен на всех unixes и может быть запущен на Windows.

Ответ 2

После некоторых исследований я нашел следующее в этой ссылке:

Стандарт POSIX требует, чтобы C stdio Операции FILE * являются атомарными. POSIX-совместимые библиотеки C (например, on Solaris и GNU/Linux) имеют внутренний мьютекс для сериализации операций на FILE * s.

Похоже, что вызовы должны быть атомарными, но это зависит от вашей платформы. В той же ссылке есть еще один абзац, который позволяет подумать, что программист должен заботиться:

Итак, для 3.0 вопрос "есть многопоточный сейф для ввода/вывода" должен быть ответил: "Ваша платформа C библиотека потокобезопасна для ввода-вывода?" Некоторые из них по умолчанию некоторые из них не являются; многие предлагают множественные реализации C библиотеки с различными компромиссами безопасность потоков и эффективность. Вы, программист, всегда требуется позаботьтесь о нескольких потоках.

Кроме того, поскольку у вас есть два разных FILE* в двух разных процессах, я думаю, что у вас нет выбора.

Ответ 3

Из "man flockfile" в Debian lenny функции stdio являются потокобезопасными.

Для более подробной информации существуют функции, не связанные с потоками, "man unlocked_stdio".

Вы можете получить дополнительную информацию на странице руководства.

Ответ 4

fwrite для визуальной студии блокирует вызывающий поток и поэтому является потокобезопасным