Является ли fwrite атомным? - PullRequest
       16

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

10 голосов
/ 08 февраля 2010

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 08 февраля 2010

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

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

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

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

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

3 голосов
/ 08 февраля 2010

Можно смешивать.

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

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

1 голос
/ 16 ноября 2010

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

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

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

0 голосов
/ 27 ноября 2013

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

...