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