如何在LynxOS / POSIX中同步对共享内存的访问?
我正在通过共享内存进行通信的LynxOS SE (POSIX conformant)系统上实现两个进程。
一个过程将充当“生产者”,另一个过程充当“消费者”。 在multithreading系统中,我的方法是使用互斥和condvar(条件变量)对,消费者等待condvar(使用pthread_cond_wait
),生成器在更新共享内存时用信号通知(使用pthread_cond_wait
) 。
如何在多进程架构而不是multithreading架构中实现这一目标?
是否有LynxOS / POSIX方法来创建可在进程之间使用的condvar / mutex对?
或者在这种情况下,其他一些同步机制更合适吗?
创建进程共享互斥锁/ cond的标准方法。 变量是使用您设置pthread_mutexattr_setpshared / pthread_condattr_setpshared的属性初始化它们。 检查LynxOS是否支持。
你自然需要放置这样的互斥锁/ cond。 共享内存中的变量以某种方式,所以所有进程都可以使用它。
归功于@nos,但我想对他的答案进行一些扩展。
最后(为了清晰起见,不包括error handling)我做了如下:
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来控制对共享数据的访问。
唯一真正的问题是确保Master进程创建共享内存并在Slave进程启动之前初始化同步变量。 并确保根据需要整理munmap()
和shm_unlink()
。
注意:XSI替代方案
POSIX:XSI扩展还有其他用于共享内存的函数( shmget()
, shmat()
等), 如果它们可用,它们可能更有用,但它们不在我使用的LynxOS-SE版本上。
这是通过未命名的POSIX信号量完成的 ,即信号量本身放在共享内存中。
您可以使用共享内存/信号量IPC来实现此目的。
这是一篇很好的例子:
http://www-personal.washtenaw.cc.mi.us/~chasselb/linux275/ClassNotes/ipc/shared_mem.htm