9

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

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

4 回答 4

4

而不是 System V 信号量,我会使用一个名为 POSIX 的信号量 usingsem_open()等。

于 2013-01-16T17:44:02.873 回答
2

不妨把这个作为答案。

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

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

于 2013-01-16T17:57:29.643 回答
0

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

AFAIR,每个带有信号量的操作都需要一个系统调用,所以无争用互斥量应该比以类似互斥量的方式使用的信号量 [ab] 更快。

于 2013-01-16T17:49:18.523 回答
0

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

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

于 2013-01-16T18:00:18.103 回答