C++ 跨2个进程而不是线程锁定自由/原子操作

C++ 跨2个进程而不是线程锁定自由/原子操作,c++,linux,ipc,interprocess,lock-free,C++,Linux,Ipc,Interprocess,Lock Free,我使用共享内存跨多个进程共享一些数据;我使用进程间互斥来实现同步 我的问题是:是否可以使用无锁数据结构和/或原子操作来实现更快的同步,而无需在两个进程之间使用互斥 如果没有,你知道这是什么主要原因吗 它们仅用于同步同一进程的线程。这些概念是否也适用于流程?如果没有,您知道跨流程共享/同步数据的更快方法吗 这些概念是否也适用于流程 是的,原子操作对于线程和进程都是通用的,如果原子使用的内存是共享的 原子操作是处理器本身的特定指令,对线程或进程一无所知,它只是低级别硬件实现的全部或全部(不可分割)复

我使用共享内存跨多个进程共享一些数据;我使用进程间互斥来实现同步

我的问题是:是否可以使用无锁数据结构和/或原子操作来实现更快的同步,而无需在两个进程之间使用互斥

如果没有,你知道这是什么主要原因吗

它们仅用于同步同一进程的线程。这些概念是否也适用于流程?如果没有,您知道跨流程共享/同步数据的更快方法吗

这些概念是否也适用于流程

是的,原子操作对于线程和进程都是通用的,如果原子使用的内存是共享的

原子操作是处理器本身的特定指令,对线程或进程一无所知,它只是低级别硬件实现的全部或全部(不可分割)复杂操作(读取、比较、存储)

因此,您可以在进程之间设置共享内存,并在其中放入原子元素

无锁

是的,如果仅使用原子实现无锁。(应该)

数据结构

当共享内存用于存储指针(在数据结构中)时,您应该检查它是否映射到两个进程中的相同地址

如果内存将映射到不同的地址,指针将在另一个进程中中断。在这种情况下,您需要使用相对地址,并执行简单的内存转换

进程间互斥


我应该说glibc>2.4(NPTL)将futex与原子操作结合起来用于非争用锁(对于进程共享互斥=进程间互斥)。因此,您已经在共享内存中使用了原子操作。

在带有NPTL的x86上,大多数同步原语的快速路径只有一个带完整内存屏障的联锁操作。因为x86平台没有比这更轻的东西,所以它们已经是您所能做到的最好了。除非现有的原子操作完全满足您的需要,否则就不会有性能提升来偿还使用语义更轻原语的成本。

您可能会发现这只会使性能更差。但是不要对同一进程中的线程使用进程间同步原语。同步原语非常接近您在x86上可能拥有的最小值,并且可以获得任何同步。感谢osgx。如果我在共享内存中存储简单的整数,通过uuu gcc\u sync\u fetch\u和xxx操作进行读/写,您认为它可能会起作用吗?如果我没说错的话,atomic\u t不再像过去在atomic.h中那样可用。是的,\u\u sync是原子内置的。不知道原子的可用性,但你应该知道,在原子操作中允许使用哪些大小的数据,以及它的对齐方式(这在不同的cpu之间有所不同,甚至在Intel Pentium3-4 vs Core2中)。嗯,如果他使用互斥来保护一些共享数据,那么每次访问都会有互斥锁和互斥锁解锁。如果数据很短(并非所有类型的使用都是如此,但对于某些类型的使用都是如此),则可以使用单原子操作来更改数据,这比fastpath轻两倍(不包括默认互斥逻辑:在互斥类型之间切换;从选择快速/慢速路径跳转)。嗨,David。让我检查一下我是否理解正确:你是说如果我必须严格地“锁定”/“同步”一个代码区域,linux posix锁定原语已经是可用的最快/最好的解决方案。。但是如果我想严格执行add/xor/等操作。。原子操作\uuuu sync\u fetch\u和\uxxx更快。我说的对吗?@osgx都一样。他有一个互锁的锁操作,没有一个解锁操作。剩下的代码几乎没有优化。@Abruzzofortegentile如果原子操作完全按照您的需要执行,它们会更快。但是如果你不得不假装它们没有,锁通常会更快。“剩下的代码几乎什么都没有优化”。。。由编译器优化?中央处理器?PLT是如何优化的?JMP是如何优化的?(原子指令+2分支+PLT调用)=互斥如何比(原子指令)更快?它可以是相同的速度顺序,但它稍微慢一点。