Синхронизация Общей Памяти Linux

я реализовал два приложения, которые обмениваются данными с помощью API общей памяти POSIX (т. е. shm_open). Один процесс обновляет данные, хранящиеся в сегменте общей памяти, а другой процесс считывает их. Я хочу синхронизировать доступ к области общей памяти, используя какой-то мьютекс или семафор. Каков наиболее эффективный способ сделать это? Некоторые механизмы я рассматриваю это

  • мьютекс POSIX, хранящийся в сегменте общей памяти (установка PTHREAD_PROCESS_SHARED атрибут будет обязательным)
  • создание семафора System V с помощью semget

4 ответов


вместо семафора System V я бы пошел с POSIX с именем semaphore, используя sem_open(), etc.


можно также сделать это ответом.

можно использовать sem_init С pshared true для создания семафора POSIX в пространстве общей памяти. Я успешно использовал это в прошлом.

Что касается того, является ли это быстрее или медленнее, чем общий мьютекс и переменная условия, только профилирование может сказать вам. В Linux я подозреваю, что все они довольно похожи, поскольку они полагаются на оборудование "futex".


Если важна эффективность, я бы пошел с Процесс-общими мьютексами и переменными условий.

AFAIR, каждая операция с семафором требует syscall, поэтому незапланированный мьютекс должен быть быстрее, чем семафор [ab], используемый в мьютексе.


во-первых, действительно бенчмарк, чтобы знать, важна ли производительность. Стоимость этих вещей часто переоценивают. Поэтому, если вы не обнаружите, что доступ к структуре управления имеет тот же порядок величины, что и записи, просто возьмите любую конструкцию, которая семантически лучше всего подходит для вашего случая использования. Это было бы обычно, если бы у вас было около 100 байтов, записанных на доступ к структуре управления.

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