我正在使用共享内存在多个进程之间共享一些数据;我使用进程间互斥锁来实现同步。
我的问题如下:是否可以使用无锁数据结构和/或原子操作来实现更快的同步,而无需在 2 个进程之间使用互斥锁?
如果没有,您知道造成这种情况的主要原因是什么吗?
它们仅用于同步同一进程的线程。这些概念是否也可移植到流程中?如果他们不是,您是否知道任何更快的跨进程共享/同步数据的方法?
我正在使用共享内存在多个进程之间共享一些数据;我使用进程间互斥锁来实现同步。
我的问题如下:是否可以使用无锁数据结构和/或原子操作来实现更快的同步,而无需在 2 个进程之间使用互斥锁?
如果没有,您知道造成这种情况的主要原因是什么吗?
它们仅用于同步同一进程的线程。这些概念是否也可移植到流程中?如果他们不是,您是否知道任何更快的跨进程共享/同步数据的方法?
这些概念是否也可移植到流程中?
是的,原子操作对于线程和进程都是通用的,IIF 原子使用的内存是共享的。
原子操作是处理器本身的特定指令,对线程或进程一无所知,它只是具有低级硬件实现的动作(读取;比较;存储)的全有或全无(不可分割)复合体。
因此,您可以在进程之间设置共享内存并将 atomic_t 放入其中。
无锁
是的,如果仅使用原子实现无锁。(它应该)
数据结构
您应该检查,当共享内存用于存储指针(在数据结构中)时,它在两个进程中映射到相同的地址。
如果内存将被映射到不同的地址,则指针将在另一个进程中被破坏。在这种情况下,您需要使用相对地址,并进行简单的内存转换。
进程间互斥锁
我应该说 glibc>2.4 (NPTL) 将 futex 与原子操作结合用于非竞争锁(对于进程共享互斥锁 = 进程间互斥锁)。因此,您已经在共享内存中使用了原子操作。
在带有 NPTL 的 x86 上,大多数同步原语只有一个带有完整内存屏障的互锁操作作为它们的快速路径。由于 x86 平台没有比这更轻的东西,它们已经是你能做的最好的了。除非现有的原子操作完全符合您的需要,否则不会有性能提升来偿还使用语义更轻的原语的成本。