Я пишу приложение, которое должно быть в состоянии обрабатывать много одновременных обращений к нему, как потоками, так и процессами. Так что никакие mutex'ы или блокировки не должны применяться к этому.
Чтобы свести к минимуму использование блокировок, я планирую, чтобы файл был «только для добавления», поэтому все данные сначала добавляются на диск, а затем адрес, указывающий на информацию, которую он обновил. , изменен для ссылки на новый. Поэтому мне нужно будет внедрить небольшую систему блокировок только для того, чтобы изменить этот int так, чтобы он ссылался на новый адрес.
Как лучше всего это сделать?
Я думал о том, чтобы поставить флаг перед адресом, чтобы при его установке читатели использовали спин-блокировку до тех пор, пока она не будет освобождена. Но я боюсь, что это совсем не атомно, не так ли?
например,
- читатель читает флаг, и он не установлен
- в это же время писатель записывает флаг и изменяет значение int
- читатель может прочитать несоответствующее значение!
Я ищу методы блокировки, но все, что я нахожу, это либо методы блокировки потоков, либо блокирование всего файла, а не полей. Разве это невозможно сделать? Как базы данных только для добавления справляются с этим?
редактирование:
Я смотрел на то, как это делают базы данных только для добавления (couchDB), и кажется, что они используют поток только для сериализации записей в файл. Означает ли это, что невозможно сделать их встраиваемыми, например, sqlite, без блокировки всего файла блокировками файловой системы?
Спасибо!
Cauê