首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在LynxOS/POSIX中同步对共享内存的访问?

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

Stack Overflow用户
提问于 2010-04-06 20:15:20
回答 3查看 17.1K关注 0票数 14

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

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

如何在多进程而不是多线程架构中实现这一点?

有没有一种LynxOS/POSIX方法来创建可以在进程之间使用的condvar/mutex对?

或者在这种情况下是否有其他的同步机制更合适?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-07 01:39:38

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

您自然需要放置这样的互斥对象/cond。变量,所以所有的进程都可以使用它。

票数 8
EN

Stack Overflow用户

发布于 2010-04-09 07:22:38

功劳归功于@nos,但我想在他的回答上做一点扩展。

最后(为了清楚起见,不包括错误处理),我做了如下操作:

1.定义共享内存结构

它包含进程间同步对象和要共享的数据。

代码语言:javascript
复制
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.创建共享内存并设置大小(主进程)

在主进程上创建一个新的共享内存对象:

代码语言:javascript
复制
fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(shared_data_t));

2.或打开共享内存(从进程)

在Slave上,只需附加到现有对象:

代码语言:javascript
复制
fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);

3. Mmap到进程空间

代码语言:javascript
复制
// Specify addr of calling address, mostly use NULL is most portable way
shared_data_t* sdata = (shared_data_t*)mmap(NULL, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);

4.初始化同步变量(仅限主进程)

代码语言:javascript
复制
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替代方案

XSI扩展还有其他用于共享内存的函数(shmget()shmat()等),如果它们可用,可能会更有用,但它们不在我正在使用的LynxOS-SE版本上。

票数 28
EN

Stack Overflow用户

发布于 2010-04-06 20:28:07

您可以使用共享内存/信号量IPC来实现这一点。

这里有一篇文章,有一个很好的例子:

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2584678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档