gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:45:38 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

归功于@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 上只附加到现有对象:

fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);

3。 mmap到进程空间

// 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。初始化同步变量(仅限主进程)

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 版本上。

关于c - 如何在 LynxOS/POSIX 中同步对共享内存的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2584678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com