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

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

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

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

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

10
задан GrahamS 6 April 2010 в 12:15
поделиться

4 ответа

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

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

5
ответ дан 3 December 2019 в 14:00
поделиться

Благодарим @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. Создайте совместно используемую память и установите размер (главный процесс)

В главном процессе создайте новый объект совместно используемой памяти:

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

2. ИЛИ Откройте разделяемую память (процесс Slave)

На 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, которую я использую.

22
ответ дан 3 December 2019 в 14:00
поделиться

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

6
ответ дан 3 December 2019 в 14:00
поделиться

Этого можно добиться с помощью IPC с общей памятью / семафором.

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

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

5
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: