Синхронизация Общей Памяти Linux
я реализовал два приложения, которые обмениваются данными с помощью API общей памяти POSIX (т. е. shm_open
). Один процесс обновляет данные, хранящиеся в сегменте общей памяти, а другой процесс считывает их. Я хочу синхронизировать доступ к области общей памяти, используя какой-то мьютекс или семафор. Каков наиболее эффективный способ сделать это? Некоторые механизмы я рассматриваю это
- мьютекс POSIX, хранящийся в сегменте общей памяти (установка PTHREAD_PROCESS_SHARED атрибут будет обязательным)
- создание семафора System V с помощью
semget
4 ответов
можно также сделать это ответом.
можно использовать sem_init С pshared
true для создания семафора POSIX в пространстве общей памяти. Я успешно использовал это в прошлом.
Что касается того, является ли это быстрее или медленнее, чем общий мьютекс и переменная условия, только профилирование может сказать вам. В Linux я подозреваю, что все они довольно похожи, поскольку они полагаются на оборудование "futex".
Если важна эффективность, я бы пошел с Процесс-общими мьютексами и переменными условий.
AFAIR, каждая операция с семафором требует syscall, поэтому незапланированный мьютекс должен быть быстрее, чем семафор [ab], используемый в мьютексе.
во-первых, действительно бенчмарк, чтобы знать, важна ли производительность. Стоимость этих вещей часто переоценивают. Поэтому, если вы не обнаружите, что доступ к структуре управления имеет тот же порядок величины, что и записи, просто возьмите любую конструкцию, которая семантически лучше всего подходит для вашего случая использования. Это было бы обычно, если бы у вас было около 100 байтов, записанных на доступ к структуре управления.
в противном случае, если структура управления является узким местом, вы, возможно, следует избегайте их использования. C11 имеет новую концепцию _Atomic
типы и операции, которые могут использоваться в случаях, когда есть расы в доступе к данным. C11 еще не широко реализован, но, вероятно, все современные компиляторы имеют расширения, которые уже реализуют эти функции.