Я реализую два процесса на LynxOS SE (совместимый POSIX) система, которая свяжется через общую память.
Один процесс будет действовать как "производитель" и другой "потребитель". В многопоточной системе мой подход к этому должен был бы использовать взаимное исключение и condvar (условная переменная) пара с потребителем, ожидающим на condvar (с pthread_cond_wait
) и производитель, предупреждающий о нем (с pthread_cond_signal
) когда общая память обновляется.
Как я достигаю этого в мультипроцессе, а не многопоточный, архитектура?
Существует ли способ LynxOS/POSIX создать condvar/mutex пару, которая может использоваться между процессами?
Или действительно ли некоторый другой механизм синхронизации является более соответствующим в этом сценарии?
Стандартный способ создания общего мьютекса / условия процесса. переменная - инициализировать их с помощью атрибута, в котором вы устанавливаете pthread_mutexattr_setpshared / pthread_condattr_setpshared. Проверьте, поддерживает ли это LynxOS.
Естественно, вам нужно будет разместить такие мьютексы / cond. переменные в общей памяти каким-то образом, поэтому все процессы могут ее использовать.
Благодарим @nos, но я хотел бы немного расширить его ответ.
В итоге (за исключением обработки ошибок для ясности) я сделал следующее:
. Она содержит объекты синхронизации между процессами и данные, которые будут совместно использоваться.
typedef struct
{
// Synchronisation objects
pthread_mutex_t ipc_mutex;
pthread_cond_t ipc_condvar;
// Shared data
int number;
char data[1024];
} shared_data_t;
В главном процессе создайте новый объект совместно используемой памяти:
fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(shared_data_t));
На Slave просто подключитесь к существующему объекту:
fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);
shared_data_t* sdata = (shared_data_t*)mmap(0, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
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 ()
по мере необходимости.
Расширение POSIX: XSI имеет другие функции для совместного использования памяти ( shmget ()
, shmat ()
и т. Д.), Которые могут быть более полезными , если они доступны, но их нет в версии LynxOS-SE, которую я использую.
Это делается с помощью безымянных семафоров POSIX , то есть сами семафоры помещаются в разделяемую память.
Этого можно добиться с помощью IPC с общей памятью / семафором.
Вот статья с хорошим примером:
http://www-personal.washtenaw.cc.mi.us/~chasselb/linux275/ClassNotes/ipc/shared_mem.htm