pthread mutex cond 进程间共享(PTHREAD_PROCESS_SHARED)性能探究

Linux进程间共享内存通信时如何同步?(附源码) 然后,程序使用互斥量和条件变量来同步进程之间的访问共享内存区域。需要注意的是,在使用条件变量时,我们需要遵循一些规则来保证程序的正确性,如在等待条件变量时必须锁定互斥量,并使用while循环来检查条件变量的值是否满足要求,等待条件变量信号的线程必须在等待之前锁定互斥量,在等待之后解锁互斥量,等待条件变量信号的线程可能会因为接收到信号而提前返回等等。总之,使用互斥量和条件变量来实现进程间共享内存通信的同步,需要我们仔细考虑程序中所有可能出现的情况,并正确地使用互斥量和条件变量函数来同步进程之间的访问。 阅读详情

pthread中提供了pthread_mutex_t互斥锁 和 pthread_cond_t条件变量,我们通常在同一进程不同线程中使用,很少在进程间使用,这次通过实现一个生产者解锁多个阻塞消费者的例子来展示下用法。

 

由于pthread_mutex_t不提供通过名称来在进程间共享的功能,我们通过共享内存的方式来达到共享。注意的是要指定PTHREAD_PROCESS_SHARED

struct SHM_Data
{
    pthread_mutex_t mutex;
    pthread_cond_t cond;
};
// 打开共享内存
shm_fd_ = shm_open(shm_path_.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0777);
if (shm_fd_ < 0)
{
    printf("shm_open  failed\n");
    return false;
}
uint64_t size = sizeof(SHM_Data);
if (ftruncate(shm_fd_, size) == -1)
{
    printf("ftruncate  failed\n");
    return false;
}
shm_data_ = (SHM_Data *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd_, 0);
if (shm_data_ == MAP_FAILED)
{
    printf("mmap  failed\n");
    return false;
}
pthread_mutexattr_t attrmutex;
pthread_mutexattr_init(&attrmutex);
pthread_mutexattr_setpshared(&attrmutex, PTHREAD_PROCESS_SHARED);

pthread_mutex_init(&shm_data_->mutex, &attrmutex);
printf("pthread_mutex_init  success\n");

pthread_condattr_t attrcond;
pthread_condattr_init(&attrcond);
pthread_condattr_setpshared(&attrcond, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&shm_data_->cond, &attrcond);

while (true) {
    
    timeval tv;
    gettimeofday(&tv, NULL);
    printf("%ld\n", tv.tv_usec);
    pthread_mutex_lock(&shm_data_->mutex);
    pthread_cond_broadcast(&shm_data_->cond);
    pthread_mutex_unlock(&shm_data_->mutex);
    sleep(1);
}

消费者通过相同的共享内存映射结构体,就可以在mutex 和cond上进行wait。和普通使用没有什么区别

shm_fd_ = shm_open(shm_path_.c_str(), O_RDWR, 0777);
if (shm_fd_ < 0)
{
    printf("shm_open  failed\n");
    return false;
}

SHM_Data *shm_info_ = (SHM_Data *)mmap(NULL, sizeof(SHM_Data), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd_, 0);
if (shm_info_ == MAP_FAILED)
{
    printf("mmap info failed\n");
    return false;
}



while (true) {
    timeval tv;
    gettimeofday(&tv, NULL);
    printf("%ld\n", tv.tv_usec);
    pthread_mutex_lock(&shm_data_->mutex);
    pthread_cond_wait(&shm_data_->cond, &shm_data_->mutex);
    pthread_mutex_unlock(&shm_data_->mutex);
}

经过测试发现,消费者解锁和有名信号量解锁以及inotify解锁的方式基本等价,大概在40-80us之间波动。

进程间 互斥锁用法 linux系统编程 创建映射区,两个进程共享锁和操作变量。 关键是改变锁的属性由线程共享改为进程共享 pthread_mutexattr_t mutexattr; pthread_mutexattr_setpshared(&mm->mutexattr,PTHREAD_PROCESS_SHARED); //设置锁属性为进程间共享 //PTHREAD_PROCESS_SHARED 进程间 //PTHREAD_PROCESS_PRIVATE 线程间(默认) #include<stdio.h> #incl 阅读详情

相关推荐

Linux C++ 多线程编程基础——条件变量和信号量

1. 信号量:简述:用于进程传递信号的一个整数值。它在linux C++中表示为sem_t包含在&lt;semaphore.h&gt;中。操作:    函数sem_init原型如下:/* Initialize semaphore object SEM to VALUE. If PSHARED then share it with other processes. */ extern in...

PurpleDream的博客 2286

linux中PTHREAD_PROCESS_SHARED属性的应用示例

然后,通过pthread_mutexattr_setpshared函数将互斥锁属性设置为PTHREAD_PROCESS_SHARED,使得该互斥锁可以在多个进程之间共享。所以,PTHREAD_PROCESS_SHARED是一个表示互斥锁或条件变量进程共享属性的宏定义,在多进程环境中使用时,可以通过设置属性参数来实现线程之间的共享和同步。需要注意的是,使用进程间共享的互斥锁或条件变量时,需要特别小心处理同步问题,确保在不同进程中的线程正确地获取和释放锁,并避免死锁和竞态条件等问题。

最后一个bug的博客 1679

STM32+FreeRTOS实现POSIX接口:嵌入式开发与开源生态的桥梁

POSIX(可移植操作系统接口)是一套广泛遵循的操作系统API标准,它为软件提供了跨平台的可移植性基础。其核心原理在于定义了一套通用的线程管理、进程间通信和同步机制接口,使得遵循此标准的软件能在不同操作系统上平滑运行。这一标准的技术价值在于极大地促进了代码复用和软件生态融合,降低了模块化软件在不同平台间的迁移成本。在嵌入式系统领域,尤其是物联网和边缘计算设备中,随着功能复杂度的提升,对成熟开源中间件、协议栈和算法库的需求日益增长,而这些组件往往优先适配POSIX标准接口。因此,在资源受限的微控制器(如STM

weixin_30307921的博客 384

Linux系统编程—进程间同步

我们知道,线程间同步有多种方式,比如:信号量、互斥量、读写锁,等等。那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁。 ##互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上,互斥量也可以用于进程间的同步。为了达到这一目的,可以在pthread_mutex_init初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个: 主要应用函数: pthread_mutexattr_t mattr 类型: 用于定义互斥量的属性 pthread_mutexattr_i

码到成功 808

Linux进程间通信(IPC)核心机制详解:从管道到共享内存实战指南

进程间通信是操作系统和分布式系统的基础概念,它定义了不同进程间交换数据和协调工作的机制。其核心原理在于突破进程隔离的内存空间,通过内核提供的多种通道实现数据传递。这项技术的工程价值在于构建模块化、可扩展的软件架构,是实现高性能服务器、桌面应用和嵌入式系统的关键技术。在实际应用场景中,开发者需要根据数据传输量、性能要求和进程关系,在匿名管道、命名管道、共享内存、消息队列、Unix域套接字和信号等机制中做出选择。例如,共享内存以其直接内存访问的特性,成为大数据交换和高性能计算场景的首选,但必须配合信号量等同步机

weixin_30696427的博客 314

Linux线程同步机制详解:互斥锁、条件变量与读写锁

线程同步是多线程编程中的核心概念,用于解决共享资源访问时的数据竞争问题。其基本原理是通过协调线程执行顺序,确保对临界区的互斥访问。在Linux系统中,常见的同步机制包括互斥锁、条件变量、读写锁和信号量等,它们各自针对不同的应用场景进行了优化。互斥锁(Mutex)作为最基础的同步原语,通过简单的加锁/解锁操作实现资源独占访问;条件变量(Condition Variable)则提供了更灵活的线程间通信能力,常与互斥锁配合使用实现复杂的等待/通知机制。这些同步技术在开发高性能服务器、数据库系统等并发应用中具有重要

439

Linux下使用pthread实现进程锁的注意事项

1. 背景 最近通过共享内存mmap实现多进程的数据共享,使用PTHREAD_PROCESS_SHARED时写错了,导致进程锁不起作用。 2. 接口 接口说明如下,用法与多线程的互斥锁类似,但需要额外设置一下PTHREAD_PROCESS_SHARED SYNOPSIS #include <pthread.h> int pthread_mutexattr_getpshared( const pthread_m

staticnetwind的专栏 1559

ITK-snap进行分割区域标注、三维显示及改变显示颜色

在进行医学图像器官分割时,无论我们是用传统方法还是深度学习,最后肯定要用到手动分割的区域作为金标准来验证我们方法的精度。但是手动标注器官的轮廓是十分耗时的,这里我介绍一个比较简单的标注方法,以肺分割作为例子。 我们使用ITK-snap作为分割标注工具。 当切片间距离比较小时,比如1mm,一个患者的完整HRCT序列通常在200张以上,如果让医生一一进行分割区域标注是非常耗时乏味的。因此,我们可以使用最简单的阈值法比如OSTU,加上基本的形态学操作对肺进行粗分割得到粗略的分割掩码,在此基础上再手动的对分割结果进

u010409517的博客 2万+

共享内存防止读写冲突

共享内存的读写冲突问题: 在设计上尽量就是一个写,一个或多个读。那么要解决的问题有两个: 1. 读写同步问题,例如如果写一段数据中就有人来读了,那就是读到了一半旧的一半新的数据,播放帧就是花屏,又例如写结构体,先写帧地址,在写帧长度,那么user就可能读到新的地址和旧的长度导致越界(实际和读写锁一样:写比读优先,写时不允许读写,多个可以同时读)。 2. 写了之后通知读者有更新。和信号量的一对...

去级得骨灰 1万+

基于大模型的JMeter日志智能分析服务化实践

在软件性能测试领域,日志分析是定位系统瓶颈、评估稳定性的关键环节。传统基于规则或正则表达式的分析方法,在面对格式多变、上下文关联复杂的海量日志时,往往效率低下且难以深入。大语言模型(LLM)凭借其强大的自然语言理解与推理能力,为这一挑战提供了新的解决方案。其技术价值在于能够自动化地从非结构化文本中提取语义信息、关联分散的上下文,并生成可操作的根因分析与优化建议,从而将工程师从繁琐的日志筛查中解放出来,显著提升问题诊断的深度与效率。这一技术可广泛应用于自动化测试报告生成、实时监控预警、脚本调试辅助等工程实践场

weixin_28839549的博客 338

【上海大学计算机组成原理实验报告】七、程序转移机制

学习实现程序转移的硬件机制//掌握堆栈寄存器的使用//手动方式实现子程序调用转移过程//手动方式实现子程序返回转移过程//编程实现`OUT`寄存器交替显示`11`和`55`//若要求`11`和`55`各显示`50`次后停机,应该如何修改程序?//根据实验指导书的相关内容,实验箱系统的程序转移硬件机制在于,当`LDPC`有效时,如果此时`DUBS`上的值就是转移的目标地址,则此目标地址被打入`PC`,从而实现程序的转移;若`LDPC`为`0`是附带条件的,就形成“条件转移”。

HackerKevon的博客 2471

多进程之间共享内存通信之pthread_mutex_t

    在做项目的过程中发现一种简便的多进程通信的方法,现将它记录下来。该项目采用多进程的方式向多个客户端同时发视频数据。    1、创建共享内存结构体    struct shm_mutex { int pic_size; char pic_buf[PIC_COUNT]; struct  env_msg  env; pthread_mutex_t mutex; pthread_mutexattr...

weixin_42218802的博客 4068

Playwright Java环境配置避坑指南:浏览器路径、类加载与离线部署

Playwright作为现代端到端测试框架,其Java SDK突破了传统Selenium的Driver管理模式,将Chromium/Firefox/WebKit内核视为可编程运行时资源。其核心原理在于SDK与浏览器二进制分离——Maven仅管理Java字节码,而浏览器需独立下载、校验与沙箱加载。这一设计带来显著技术价值:跨平台一致性、进程隔离安全性及多浏览器并行能力;典型应用场景涵盖Spring Boot集成测试、金融级离线CI/CD、Kubernetes容器化部署及Air-Gapped封闭环境。然而,因J

weixin_32956805的博客 675

线程及进程同步方法分享(三): 进程同步(pthread_cond+互斥量)

线程及进程的同步 可以使用 信号量, 信号的方法。 但实际使用过程中遇到一个难题,就是sem_timedwait 使用的是绝对时间, 如果timedwait过程中修改系统时间则会出现异常, timeout 提前退出或timeout 到期后还无法退出。 原来的方法: 线程同步使用pthread_cond+ mutex的方法可以参考如下文章。 https://blog.youkuaiyun.com/w...

wys的专栏 502

超实用!用 Ollama + DeepSeek + Dify 搭建本地知识库,提升企业效率

本文介绍了如何使用 Ollama + DeepSeek + Dify 搭建本地知识库,帮助企业高效管理信息。通过简单配置,可实现智能问答、文档检索等功能,提升效率并保障数据安全。

Happiness is everywhere 4294

图解说明JLink驱动与目标板电源匹配的关键细节

深入讲解JLink驱动安装及使用过程中,如何正确匹配目标板电源,避免常见通信故障。通过图解方式清晰展示关键连接细节,确保调试稳定可靠,是嵌入式开发中不可或缺的实战经验分享。

weixin_42173218的博客 431

Linux --- 共享内存

共享内存是Linux进程间通信(IPC)中性能最高的机制,但也存在同步设计、生命周期管理和崩溃一致性等隐患。文章深入分析了共享内存的工作原理,包括虚拟地址映射、页表关系、mmap()和缺页异常等内核机制,指出缓存一致性不等于程序同步正确性。同时对比了5种Linux共享内存方案(POSIX、System V、文件映射、匿名映射、memfd_create)的优缺点及适用场景,并详细讲解了POSIX共享内存的生命周期管理,包括创建、权限控制和大小设置等关键操作。文章强调共享内存仅提供数据共享区域,开发者需自行处理

MzKyle的博客 823

centos+apache+subversion+LDAP

yum install subversion 报错:[Errno 14] HTTP Error 416 - Requested Range Not Satisfiable 正在尝试其它镜像。 zaici

qq_41566366的博客 1544

进程间与线程间锁的方式与常用函数

八、关于锁  锁主要分为互斥锁pthread_mutex/读写锁pthread_rwlock、信号量sem、文件锁flock、记录锁(文件锁的升级版)fcntl控制  还有条件变量pthread_cond,虽然它不是锁,但经常跟互斥锁配合使用  互斥锁、信号量可用于进程间和线程间通信  读写锁用于线程间通信  文件锁、记录锁用于进程间通信     1 互斥锁/互斥量  可用于线程

a504325677的博客 642

【PG高可用】一 PostgreSQL高可用方案repmgr部署(非常详细)

repmgr安装部署

DBA之路的博客 7052

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux系统编程—用mmap实现高效进程间通信

这篇文章我们从原理到代码,完整实现了一个基于 mmap 的进程间通信方案,它可以实现多进程的可控协作,而且性能非常高,比传统的 IPC 方式快了几十倍。mmap 共享内存非常适合那些需要高频交互、大数据量传输的场景,比如视频处理、高频交易、多进程控制等等,掌握这个技术,对你的 Linux 开发会有很大的帮助。

我的博客 361

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

进程间同步——互斥锁与条件变量

1 int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr); 2 int pthread_mutex_destroy (pthread_mutex_t * mutex); 3 int pthread_mutex_lock (pthread_mutex_t * mutex ); 4 int pthrea

wenyaocn的博客 559

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

System V共享内存与环形队列:构建高性能进程间通信(IPC)方案

进程间通信(IPC)是操作系统和分布式系统中的核心概念,它允许不同进程安全高效地交换数据。其原理基于操作系统提供的共享内存、消息传递等机制,通过在进程间建立数据通道实现协作。在技术价值上,高效的IPC能显著提升系统吞吐量、降低延迟,尤其在高频交易、实时音视频处理等场景中至关重要。应用场景广泛,从金融交易系统到物联网数据采集,都需要可靠的进程间数据交换。本文聚焦于System V共享内存这一经典IPC技术,结合环形队列设计,深入探讨如何构建一个高性能、低延迟的IPC解决方案,其中涉及共享内存管理、同步机制等关

weixin_30568591的博客 363

Mutex linux线程锁

1.互斥量:Mutex 多线程同一时间在同一块内存区域操作数据,防止数据的不一致. 挣用或者竞争情况 通常发生在多线程,执行的操作在相同的内存区域,比如修改同一个状态变量。 锁主要是锁住共享资源, 对于多线程访问的全局变量,需要添加锁。 a.用于互斥访问 b.类型:pthread_mutex_t,必须被初始化为PTHREAD_MUTEX_INITIALIZER(用于静态分配的mu...

weixin_30472035的博客 155

深入浅出 多线程编程(2)

多线程

qq_62309585的博客 617

POSIX进程同步(一):互斥锁和条件变量

文章目录前言一、互斥量和条件变量的初始化二、操作步骤三、代码小例子 前言 对于进程间的同步知识,之前觉的自己什么都了解一些,在使用的时候觉的什么都不确定。所以决定好好温故一下。 互斥量和条件变量出自Posix.1线程标准,一般用于线程间的同步,但是它也可以用作进程间的同步。 是否能用于进程间同步在posix中是一个选项,不是必然的要求。可以通过如下代码测试是否支持进程间同步 #ifdef _POSIX_THREAD_PROCESS_SHARED //支持进程间同步 #endif 一、互斥

奔跑的蜗牛 1262
上一篇: 共享内存实现多进程低延迟队列 10us
下一篇: awk 字符串转时间戳
Sweet_Oranges
博客等级 码龄12年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值