我已经实现了两个使用 POSIX 共享内存 API(即shm_open
)共享数据的应用程序。一个进程更新存储在共享内存段中的数据,另一个进程读取它。我想使用某种互斥锁或信号量来同步对共享内存区域的访问。最有效的方法是什么?我正在考虑的一些机制是
- 存储在共享内存段中的 POSIX 互斥锁(需要设置 PTHREAD_PROCESS_SHARED 属性)
- 使用创建 System V 信号量
semget
我已经实现了两个使用 POSIX 共享内存 API(即shm_open
)共享数据的应用程序。一个进程更新存储在共享内存段中的数据,另一个进程读取它。我想使用某种互斥锁或信号量来同步对共享内存区域的访问。最有效的方法是什么?我正在考虑的一些机制是
semget
而不是 System V 信号量,我会使用一个名为 POSIX 的信号量 usingsem_open()
等。
不妨把这个作为答案。
您可以使用带true 的sem_initpshared
在共享内存空间中创建 POSIX 信号量。我过去成功地使用过它。
至于这比共享互斥锁和条件变量快还是慢,只有分析才能告诉你。在 Linux 上,我怀疑它们都非常相似,因为它们依赖于“futex”机器。
如果效率很重要,我会使用进程共享的互斥锁和条件变量。
AFAIR,每个带有信号量的操作都需要一个系统调用,所以无争用互斥量应该比以类似互斥量的方式使用的信号量 [ab] 更快。
首先,真正进行基准测试以了解性能是否重要。这些东西的成本往往被高估。因此,如果您没有发现对控制结构的访问与写入的数量级相同,则只需采用语义上最适合您的用例的任何构造。如果每次访问控制结构需要写入大约 100 个字节,通常就是这种情况。
否则,如果控制结构是瓶颈,您或许应该避免使用它们。C11 具有新的_Atomic
类型和操作概念,可用于在访问数据时存在竞争的情况。C11 尚未广泛实现,但可能所有现代编译器都已经具有实现这些功能的扩展。