我已经实现了两个应用程序,它们使用POSIX共享内存API(即shm_open
)共享数据。一个进程更新存储在共享内存段中的数据,另一个进程读取它。我想使用某种互斥锁或信号量来同步访问共享内存区域。最有效的方法是什么?我正在考虑的一些机制包括:
- 在共享内存段中存储的POSIX互斥锁(需要设置PTHREAD_PROCESS_SHARED属性)
- 使用
semget
创建System V信号量
我已经实现了两个应用程序,它们使用POSIX共享内存API(即shm_open
)共享数据。一个进程更新存储在共享内存段中的数据,另一个进程读取它。我想使用某种互斥锁或信号量来同步访问共享内存区域。最有效的方法是什么?我正在考虑的一些机制包括:
semget
创建System V信号量与其使用System V信号量,我会选择使用POSIX命名信号量,使用sem_open()
等函数。
pshared
为真的sem_init
(http://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_init.html)肯定适用于此应用程序,因为他已经拥有了共享内存段。 - Nemosem_init
。据我所知,OSX就是这样一个系统。 - Jens Gustedt不妨把这当做一个答案。
你可以使用带有 pshared
参数的 sem_init 在共享内存空间中创建 POSIX 信号量。我过去成功地使用过它。
至于这是否比共享互斥锁和条件变量更快或更慢,只有通过分析才能得出结论。在 Linux 上,它们都依赖于 "futex" 机制,所以它们应该是相似的。
sem_post
应该只是一个原子增量操作,而不会导致系统调用。 - Jens Gustedt首先,真正的基准测试以了解性能是否重要。这些东西的成本经常被高估。因此,如果您发现对控制结构的访问与写入的数量级相同,只需采用在语义上最适合您的用例的任何构造即可。如果每次访问控制结构都写入了大约100个字节,则通常会出现这种情况。
否则,如果控制结构是瓶颈,您应该避免使用它们。 C11具有新概念的_Atomic
类型和操作,可用于存在数据访问竞争的情况。 C11尚未广泛实施,但可能所有现代编译器都已经实现了这些功能的扩展。
boost::interprocess
。 - Paul Rtmpfs
或hugetlbfs
上创建,增长和mmap()
文件时,会发生哪些不必要的数据复制? - tmyklebu