Совместное использование настроек между процессами без использования базы данных? - PullRequest
2 голосов
/ 24 мая 2019

Мне нужно сделать настройку пользователя доступной для различных процессов без использования базы данных, такой как SqlLite.

Параметр может быть изменен пользователем в любое время, установив / сняв флажок в графическом интерфейсе, в то время как все остальные процессы могут только читать параметр.

Приложение с несколькими процессами создано для кроссплатформенных сред (Linux, OSX, Windows) и использует сочетание .NET и C / C ++.

Чтобы справиться с проблемами параллелизма при записи и чтении параметра, я думаю, что параметр можно сохранить в виде файла в определенном месте платформы, а при изменении параметра имя файла переименовывается (так как это атомарная операция на большинстве ОС: если я правильно понял). Тогда процессам, читающим настройку, нужно знать местоположение и имена файлов, соответствующие состояниям настройки, и не нужно открывать файл, а только читать имя.

Будет ли это возможным решением? Если нет, то как это можно решить?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Я думаю, что ваше решение немного надумано, потому что вам нужно будет создать один файл, указав имя в качестве значения параметра. Это может быть много пустых файлов только для одной функции приложения.

На самом деле вам нужна не база данных, а файл настроек, например .ini .

Чтобы справиться с параллелизмом, я думаю, что вы можете использовать переменную, которая содержит путь к файлу между вашими процессами (назовем это config_path ). Каждый раз, когда процесс получает доступ к файлу, он блокирует мьютекс вокруг общей переменной config_path и освобождает его при закрытии файла.

Надеюсь, это решение подойдет вам.

1 голос
/ 24 мая 2019

В случае среды unix вы можете взглянуть на shared memory ; по сути, вы можете разделить сегмент памяти между несколькими процессами без необходимости сложного файлового ввода-вывода. Поскольку это программа для нескольких ОС, вы можете взглянуть на отображенные в память файлы

После того, как этот сегмент совместно используемой памяти инициирован, вы можете получить к нему доступ в каждом процессе или изменить его (конечно, с использованием мутов или семафоров)!

...