如何在LynxOS / POSIX中同步对共享内存的访问?

时间:2010-04-06 12:15:20

标签: c ipc posix shared-memory lynxos

我在LynxOS SE(POSIX符合)系统上实现两个进程,它们将通过共享内存进行通信。

一个过程将充当“生产者”而另一个过程将充当“消费者”。在多线程系统中,我的方法是使用互斥和condvar(条件变量)对,消费者等待condvar(使用pthread_cond_wait)并且生产者发信号(使用{{1} })当共享内存更新时。

如何在多进程架构而非多线程架构中实现这一目标?

是否有LynxOS / POSIX方法来创建可在进程之间使用的condvar / mutex对?
或者在这种情况下,其他一些同步机制更合适吗?

4 个答案:

答案 0 :(得分:21)

归功于@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来控制对共享数据的访问。

唯一真正的问题是确保Master进程创建了共享内存并在Slave进程启动之前初始化了同步变量。并确保根据需要整理munmap()shm_unlink()

注意:XSI替代

POSIX:XSI扩展还有其他共享内存的功能(shmget()shmat()等),这些功能可能更有用如果可用,但它们不在我正在使用的LynxOS-SE版本。

答案 1 :(得分:6)

这是用unnamed POSIX semaphores完成的,即信号量本身放在共享内存中。

答案 2 :(得分:5)

您可以使用共享内存/信号量IPC来实现此目的。

这是一篇很好的例子:

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

答案 3 :(得分:5)

创建进程共享互斥锁/ cond的标准方法。变量是使用您设置pthread_mutexattr_setpshared / pthread_condattr_setpshared的属性初始化它们。检查LynxOS是否支持。

你自然需要放置这样的互斥锁/ cond。不知何故,共享内存中的变量,所以所有进程都可以使用它。