Многие люди здесь говорят о mmap (), как будто это что-то исправит, но ваши издержки системного вызова в основном равны нулю по сравнению с издержками записи на диск. Помните, что добавление или запись в файлтребует, чтобы вы в любом случае обновили inode (mtime, filesize), что означает поиск по диску.
Я предлагаю вам рассмотреть возможность хранения целого числа где-то, кроме диска. Например:
запишите его в какой-нибудь nvram, которым вы управляете (например, во встроенной системе).(Если ваш RAID-контроллер имеет nvram для записи, он может сделать это для вас. Но если вы задаете этот вопрос, он, вероятно, не делает.)
записать его в свободные байтыв системной памяти CMOS (например, на оборудовании ПК).
записать его на другой компьютер в сети (если это быстрая сеть) и заставить его подтвердить.
измените дизайн приложения, чтобы можно было синхронизировать данные после каждых n транзакций, а не после каждой транзакции.Это будет примерно в n раз быстрее, чем делать это каждый раз.
перепроектируйте ваше приложение так, чтобы в случае потери целого числа изменения вашей последней транзакции составляли также потерял.Тогда тот факт, что вы технически потеряли целочисленное обновление, не имеет значения;когда вы перезагружаетесь, это будет так, как если бы вы никогда не увеличивали его, поэтому вы можете просто продолжить с него.
Вы не объяснили, зачем вам это поведение;Если честно, если ваше приложение нуждается в этом, похоже, что ваше приложение, вероятно, разработано не очень хорошо.Например, некоторые люди предложили использовать базу данных, потому что они делают такие вещи постоянно;true, но базы данных делают это медленно (т. е. синхронизируют диск каждый раз), , если только вы сначала не создадите транзакцию, и в этом случае диск необходимо синхронизировать только тогда, когда вы выполняете «транзакцию транзакции».Но если вам абсолютно необходимо иметь синхронизацию после каждого целого числа, вы будете постоянно совершать транзакции, и база данных не сможет вас от этого избежать;нет никакого волшебного способа, которым база данных могла бы гарантировать, что она не потеряет данные, если она по крайней мере не выполняет fdatasync ().