Является ли атом атомарным?
Простой вопрос:
Мне нужно добавить некоторые записи в мою программу.
Если два процесса используют "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 для визуальной студии блокирует вызывающий поток и поэтому является потокобезопасным