Я пишу серию плагинов для стороннего хост-приложения OSX, которому придется общаться друг с другом через разделяемую память.Каждый будет расположен в своем собственном dylib, и, таким образом, все они будут загружены в один и тот же хост-процесс.Или нет, в зависимости от того, запущен ли один или несколько хост-процессов.
Я хочу координировать доступ к общей памяти с помощью консультативных блокировок fcntl
, используя состояние исключительной и общей блокировки для обозначения true/ ложные условия.Таким образом, я использую эти блокировки файлов как флаги bool для всей ОС, где плагины могут проверять свое состояние, пытаясь получить эксклюзивную блокировку файла.Я предполагаю, что они работают одинаково и в Linux (отсюда и тег 'linux').
Однако везде, где я читаю, эти блокировки файлов прикрепляются не к файловым дескрипторам, а к парам (pid, inode), что делает ихпроцесс широкий, а не поток.Но в моем случае все плагины выполняются в одном и том же процессе, поэтому я предполагаю, что все они используют один и тот же pid ...?Правильно ли я пришел к выводу, что не могу использовать эти блокировки для координации своих плагинов, если они работают под одним и тем же хост-процессом?
У меня, к сожалению, нет доступа к Mac в данный момент, чтобы проверить это;отсюда и вопрос.Я также не смог найти никакой полезной информации при поиске вариантов fcntl dylib lock [thread &| process]
.
Для некоторого фона:
- Я не могу использовать
pthread_mutex
es здесь, так как онисначала нужно будет найти его в общей папке, настройку которой я должен сначала координировать (проблема с курицей и яйцом); - Я также решил не использовать семафоры, так как из-за сбойного или некорректно работающего плагина / приложения оставалосьвещь в промежуточном состоянии, делающая ее бесполезной до конца сеанса (блокировки снимаются системой после сбоя);
- Другая полезная вещь блокировок файлов - это то, что я могу ждать их при попыткесделать эксклюзивный тест блокировки (через
F_SETLKW
). - Я не могу контролировать порядок загрузки плагинов, поэтому я не могу статически пометить один плагин, чтобы он действовал как мастер-плагин, настраивая вещи;
- И я вообще не могу контролировать приложение хоста.