Как синхронизировать доступ к общей памяти в LynxOS / POSIX?

c ipc posix shared-memory lynxos

14368 просмотра

4 ответа

Я реализую два процесса в системе LynxOS SE (POSIX-совместимой), которая будет взаимодействовать через разделяемую память.

Один процесс будет выступать в роли «производителя», а другой - «потребителя». В многопоточной системе мой подход к этому состоял бы в том, чтобы использовать пару мьютекс и condvar (условная переменная), при этом потребитель ожидает на condvar (с pthread_cond_wait), а производитель сигнализирует об этом (с pthread_cond_signal), когда разделяемая память обновляется.

Как мне добиться этого в многопроцессорной, а не многопоточной архитектуре?

Существует ли способ LynxOS / POSIX для создания пары condvar / mutex, которую можно использовать между процессами?
Или какой-то другой механизм синхронизации более уместен в этом сценарии?

Автор: GrahamS Источник Размещён: 12.11.2019 09:16

Ответы (4)


5 плюса

Решение

Стандартный способ создания общего процесса mutex / cond. переменная - инициализировать их атрибутом, в котором вы устанавливаете pthread_mutexattr_setpshared / pthread_condattr_setpshared. Проверьте, поддерживает ли LynxOS это.

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

Автор: nos Размещён: 06.04.2010 05:39

22 плюса

Кредит идет на @nos, но я бы хотел немного расширить его ответ.
В итоге (исключая обработку ошибок для наглядности) я сделал следующее:

1. Определите структуру разделяемой памяти

Он содержит объекты межпроцессной синхронизации и данные для совместного использования.

typedef struct
{
    // Synchronisation objects
    pthread_mutex_t ipc_mutex;
    pthread_cond_t  ipc_condvar;
    // Shared data
    int number;
    char data[1024];
} shared_data_t;

2. Создайте общую память и установите размер (основной процесс)

В процессе Master создайте новый объект общей памяти:

fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(shared_data_t));

2. ИЛИ Откройте общую память (подчиненный процесс)

На Slave просто прикрепите к существующему объекту:

fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);

3. Mmap в пространство процесса

shared_data_t* sdata = (shared_data_t*)mmap(0, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);

4. Инициируйте переменные синхронизации (только основной процесс)

pthread_mutexattr_t mutex_attr;
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&sdata->ipc_mutex, &mutex_attr);

pthread_condattr_t cond_attr;
pthread_condattr_init(&cond_attr);
pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&sdata->ipc_condvar, &cond_attr);

Вот и все.

Mutex и cond теперь можно использовать как обычно для контроля доступа к общим данным.

Единственный реальный недостаток - убедиться, что мастер-процесс создал общую память и инициализировал переменные синхронизации до запуска подчиненного процесса. И убедитесь, что вы убираетесь munmap()и по shm_unlink()мере необходимости.

Примечание: Альтернатива XSI

Расширение POSIX: XSI имеет другие функции для совместного использования памяти ( shmget()и shmat()т. Д.) , Которые могут быть более полезными, если они доступны, но их нет в той версии LynxOS-SE, которую я использую.

Автор: GrahamS Размещён: 08.04.2010 11:22

6 плюса

Это делается с помощью неназванных семафоров POSIX , то есть сами семафоры помещаются в общую память.

Автор: Nikolai Fetissov Размещён: 06.04.2010 12:48

5 плюса

Вы можете достичь этого с помощью разделяемой памяти / семафора IPC.

Вот статья с хорошим примером:

http://www-personal.washtenaw.cc.mi.us/~chasselb/linux275/ClassNotes/ipc/shared_mem.htm

Автор: mcabral Размещён: 06.04.2010 12:28
Вопросы из категории :
32x32