Я хочу использовать анонимные семафоры в общей памяти для синхронизации нескольких процессов.
Хотя несколько операционных систем POSIX предоставляют анонимные семафоры (посредством sem_init
и связанных функций), macOS их не поддерживает.
Я обнаружил, что семафоры Mach доступны в macOS, но в semaphore_create
я не вижу эквивалента параметру pshared
в sem_init
, и мне трудно найти документацию, указывающую, что семафоры Mach/XNU на самом деле могут использоваться для синхронизации процессов, а не только потоки. Является ли это возможным?
Вот как я сейчас использую семафоры (обратите внимание, что sema
— это структура, которая содержит различные виды семафоров в зависимости от целевой ОС, например, она содержит семафор sem_t
в Linux):
Для инициализации семафора:
task_t task = current_task();
semaphore_create(task, &sema->semaphore, SYNC_POLICY_FIFO, value)
Для ожидания на нем:
semaphore_wait(sema->semaphore);
Для ожидания на нем с тайм-аутом (эквивалентная функциональность sem_timedwait
в Linux):
mach_timespec_t time;
time.tv_sec = seconds;
time.tv_nsec = useconds;
semaphore_timedwait(sema->semaphore, time);
Для сигнализации:
semaphore_signal(sema->semaphore);
Все приведенные выше примеры кода на самом деле содержатся в соответствующих функциях, которые позволяют предоставлять независимый от ОС API, тестовые вызовы, которые я выполняю для этих функций в Linux, работают, как и ожидалось, но в macOS процесс, ожидающий на семафоре, никогда не сигнализируется из другой процесс.
Что я делаю не так?
Редактировать
Я нашел это в документах :
Семафоры можно использовать везде, где могут возникать мьютексы. Это исключает их использование в обработчиках прерываний или в контексте планировщика и делает их крайне нежелательными в системе виртуальных машин.
К чему именно относится контекст планировщика? Было бы это, если бы вы писали свой собственный планировщик или это относится к какому-либо взаимодействию с планировщиком (например, к процессам).
Во всех случаях, прав ли я, что виртуальная машина означает, что ее не следует использовать с процессами, использующими виртуальную память, другими словами... со всеми пользовательскими процессами?
semaphore_t
является еще одним определением типаmach_port_t
, поэтому я предполагаю, что для совместного использования семафоров между процессами вам нужно отправить порт семафора из процесса, который его создал. процессу, который разделяет его с помощью обмена сообщениями Mach. (mach_msg
) Так вы разделяете доступ к семафору? Это не сработает, если вы просто передаете буквальное целочисленное значение, у каждого процесса есть собственная таблица имен портов. - person pmdj   schedule 06.12.2020mach_msg
, спасибо за предложение! - person Trevör   schedule 07.12.2020