Есть один файл, открытый на запись несколькими процессами, FILE_SHARE_WRITE. Каждый процесс что-то пишет в файл. По сути это лог. Атомарна ли запись в файл на уровне вызова WriteFile, или же данные могут "перемешиваться"? Если не атомарна - то можно ли добиться атомарности без использования глобальных объектов синхронизации?
Атомарность не гарантируется ИМХО. Хм. Глобальных = ядерных? Или как? Синхронизацию ты можешь и сам сделать, в принципе, но зачем изобретать велосипед. Лучше наверное сделать отдельный процесс-"писатель лога", и по пайпам/сокетам писать туда запросы на помещение записей в лог
Глобальный - всмысле например именованый мутекс. Избавиться от глобальных объектов синхронизации мне нужно потому что ввиду своей специфики приложение может законно убиваться осью в самый неожиданный для него момент. Такой стрем никак не вяжется с использованием глобальных мутексов по, надеюсь, понятным причинам. Этот вариант уже имеется на готове, но все же хочется решить вопрос "малой кровью"
Причины непонятны, т.к. если система прибьёт владельца мьютекса, то она, естесственно, освободит последний.
IceStudent В том-то и дело, что это не владелец. Если система прибьет процесс, то мутекс перейдет в стейт WAIT_ABANDONED. А это не равно ReleaseMutex.
t00x одного опыта не хватит. где написана что атомарна? то есть при записи оного гига это будет атомарная операция?
нтфс.сис при получении IRP_MJ_WRITE залочит файл до окончания операции гиг - значит гиг зато последовательность записи разных IRP вообще говоря произвольна, может пойти в запись сначала тот что пришел позже, так что мьютексы не помешают, или дожидаться окончания WriteFile
Great я на практике сталкивался только с тем что после LockFile файл не открыть до Unlock-а на этом даже защиту(!) сделали, есть такая инфосистема - кодекс как нтфс.сис его реализует - не разбирался в FastIO есть куча всяких Lock-ов - ни разу не видел чтоб они вызывались, мож на СУБД где-нить _DEN_ давно не ковырялся в ней, думаю что так же как и нтфс драйвера от микрософта думаю все так работают, ну кроме маппед-файлов конечное, там полная Ж с синхронизацией и когерентностью, но это собственно документировано в мсдн