2016-11-03 2 views
0

Когда я создал идентификатор группы семафора с помощью semget (передавая флаги IPC_CREAT | IPC_EXCL) - в общем случае мои семафоры внутри группы не инициализируются и могут содержать «случайные значения».semget: как избежать параллельного доступа к группе семафора при ее создании/инициализации?

Так что мне нужно инициализировать все семафоры сразу после получения идентификатора вновь созданной группы семафоров.

Мой вопрос:

Как избежать возможных условий гонки между semgrpID=semget(semgrpKey,nSemaphores,IPC_CREAT | IPC_EXCL); и semctl(semgrpID,0,SETALL,...); ?

+0

Процесс, который создает семафор, должен завершить инициализацию до того, как будут созданы какие-либо процессы, которые используют семафор. Типичным способом обработки этого является создание/инициализация семафора, а затем fork/exec других процессов. – user3386109

+0

Процессы, получающие доступ к этой группе семафоров, могут начинаться с crond, из CLI и могут быть инициализированы с веб-сервера. Он не разветвляется ни одним процессом. Поэтому мне нужно защитить группу семафоров, но для этого мне нужно ... семафор где-то? – drvtiny

+0

Затем, как часть последовательности запуска, вам нужно запустить программу, которая создает и инициализирует группу семафоров. Он должен закончить, прежде чем запускать программы, которые используют семафоры. – user3386109

ответ

2

Рассмотрите возможность использования семафоров POSIX вместо семафоров SYSV. Дизайн POSIX проще и чище; например, семафоры POSIX создаются с заданными начальными значениями.

Семафоры SYSV имеют, однако, некоторые возможности, которые не имеют семафоров POSIX, такие как отмененные операции и работа с многоэлементным семафором наборы. Если вы должны использовать аромат SYSV, то ...

Я полагаю, вы предполагаете использовать известный ключ для набора семафоров, чтобы у вас не было контроля над временем, в котором процессы, отличные от тех, которые предназначены для создания набор семафоров получает доступ к набору. В худшем случае у вас может быть несколько процессов, которые пытаются получить семафор, установленный с помощью одного и того же ключа, и с IPC_CREAT | IPC_EXCL, с тем, который успешно отвечает за инициализацию, а те, которые получают EEXIST, снова пытающиеся без этих флагов. Действительно, это порождает беспорядок.

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

Также можно использовать какую-либо другую форму взаимного исключения для защиты инициализации набора семафоров. Например, вы можете использовать файл блокировки. Вы даже можете использовать семафор POSIX для этой ограниченной цели.

+0

Большое спасибо, это именно то, что я хочу знать! – drvtiny

Смежные вопросы