POSIX共享内存是否自带race conditions防护机制?
POSIX共享内存的竞态条件防护说明
POSIX不会自动为跨进程共享内存的读写操作提供竞态条件防护,你必须自行添加信号量(semaphore)或互斥锁(mutex)这类同步原语来保证数据一致性。
核心原因
POSIX共享内存接口(shm_open/mmap)仅负责建立多个进程可访问的共享内存区域,本身不包含任何同步逻辑。当多个进程同时对共享内存中的结构体进行读写时,必然会出现竞态条件:
- 一个进程在更新结构体多字段的过程中,另一个进程可能读取到半更新的脏数据;
- 多个进程同时写入时,会出现数据覆盖、值丢失等问题。
可行的同步方案
- POSIX命名信号量:通过
sem_open创建跨进程可见的信号量,在访问共享内存前调用sem_wait获取锁,操作完成后调用sem_post释放锁,实现互斥访问。 - 共享内存中的POSIX互斥锁:在
shm_data_struct中加入pthread_mutex_t成员,初始化时设置PTHREAD_MUTEX_SHARED属性(让锁可跨进程共享),进程访问共享内存前调用pthread_mutex_lock,操作完成后调用pthread_mutex_unlock。
对你现有代码的补充说明
你当前的代码仅完成了共享内存的创建与映射,完全没有同步逻辑。如果直接运行两个进程对共享内存结构体进行读写,必然会出现数据不一致的问题。例如,若结构体包含多个关联字段,一个进程更新字段的间隙,另一个进程可能读取到逻辑矛盾的数据。
内容的提问来源于stack exchange,提问作者bleedingedge
相关产品推荐
相关产品推荐

