Если вы используете Linux, одним из простых вариантов является использование pshared mutexes и условных переменных. Необходима версия glibc. По существу, внутри вашего сегмента общей памяти у вас будет что-то вроде:
struct shmem_head {
pthread_mutex_t mutex;
};
Для инициализации:
void init_shmem_head(struct shmem_head *head)
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED );
pthread_mutex_init(&head->mutex, &attr);
pthread_mutexattr_destroy(&head->mutex);
}
Теперь у вас есть мьютекс, общий для всех процессов с открытым сегментом общей памяти. Вы можете просто использовать pthread_mutex_lock
для блокировки и pthread_mutex_unlock
для разблокировки как обычно. Существует также аналогичный pthread_condattr_setpshared
, если вы также хотите условные переменные.