Linux共享内存同步

时间:2013-01-16 17:31:30

标签: c linux posix shared-memory performance

我已经使用POSIX共享内存API(即shm_open)实现了两个共享数据的应用程序。一个进程更新存储在共享内存段中的数据,另一个进程读取它。我想使用某种互斥或信号量来同步对共享内存区域的访问。这样做最有效的方法是什么?我正在考虑的一些机制是

  • 存储在共享内存段中的POSIX互斥锁(需要设置PTHREAD_PROCESS_SHARED属性)
  • 使用semget
  • 创建System V信号量

4 个答案:

答案 0 :(得分:3)

而不是System V信号量,我会使用sem_open()等命名信号量的POSIX。

答案 1 :(得分:2)

不妨回答这个问题。

您可以使用sem_initpshared true在共享内存空间中创建POSIX信号量。我过去曾成功使用过它。

至于它是否比共享互斥锁和条件变量更快或更慢,只有剖析可以告诉你。在Linux上,我怀疑它们都非常相似,因为它们依赖于“futex”机器。

答案 2 :(得分:0)

如果效率很重要,我会使用进程共享的互斥锁和条件变量。

AFAIR,每个带信号量的操作都需要一个系统调用,因此无竞争互斥的速度应该比以互斥方式方式使用的信号量[ab]快。

答案 3 :(得分:0)

首先,真正的基准来了解性能是否重要。这些东西的成本往往被高估了。因此,如果您没有发现对控制结构的访问与写入的访问次数相同,那么只需采用语义上最适合您的用例的结构。如果每次访问控制结构时写入大约100个字节,通常会出现这种情况。

否则,如果控制结构是瓶颈,您应该避免使用它们。 C11具有_Atomic类型和操作的新概念,可用于存在访问数据的种族的情况。 C11尚未广泛实施,但可能所有现代编译器都具有实现这些功能的扩展。