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

企业老板管理者,如何监控员工的电脑屏幕?

老板监控员工电脑,需要知道员工开机后的上网行为来及时了解到员工工作情况,及时发现上班不良行为员工,及时淘汰低价值员工。 文章目录iMonitor EAM一、计算机系统日志二、具体功能介绍1.屏幕记录2.键盘记录总结 iMonitor EAM 怎么监控员工电脑,我们需要用到第三方软件,2021年最新版本软件-iMonitor EAM,软件分管理端和客户端,管理端在管理者电脑登录,客户端在员工电脑双击安装就可以,安装中不用任何设置的,客户端安装到员工电脑后也是隐藏的,不会有任何弹窗和警告信息,是无法发现和删

iMonitorSoft的博客 2179

共享内存防止读写冲突

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

去级得骨灰 1万+

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 954

贝塞尔曲线基础

贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算法开发,以稳定数值的方法求出贝兹曲线。

YiYeZhiNian的博客 2043

多进程之间共享内存通信之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

[FPGA高速以太网]基于Verilog与1G/2.5G Ethernet PCS/PMA IP核的2.5G UDP通信实战

本文详细介绍了基于FPGA与1G/2.5G Ethernet PCS/PMA IP核实现2.5G UDP通信的完整实战方案。文章以黑金AX7A200开发板为硬件平台,深入讲解了从硬件选型、IP核配置、Verilog测试逻辑编写到系统调试与性能验证的全过程,重点剖析了利用SGMII接口与GTP收发器实现高速数据传输的关键技术与避坑指南,为FPGA高速以太网应用开发提供了宝贵经验。

sql99的博客 567

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

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

wys的专栏 502

解决vscode 连接服务器报错:The remote host may not meet VS Code Server‘s prerequisites for glibc and libstdc++

解决vscode远程连接服务器报错:The remote host may not meet VS Code Server's prerequisites for glibc and libstdc++ (The remote host does not meet the prerequisites for running VS Code Server)

qq_37200100的博客 9909

QuickFix Java 实战(一)协议解析、环境搭建与首个应用

本文是QuickFix Java实战系列的第一篇,详细介绍了FIX协议的核心原理与QuickFix/J引擎的实战应用。内容涵盖FIX协议的标签化通信机制、QuickFix/J库的两种下载方法、协议定义文件解析,并通过一个完整的模拟订单发送示例,指导读者快速搭建首个FIX应用环境,实现消息生成与会话通信。

dog123的博客 495

Linux --- 共享内存

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

MzKyle的博客 823

spring-ai学习(四)-MCP

创建一个springai项目1.依赖。

zql1455890112的博客 1383

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

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

a504325677的博客 642

MATLAB 与 STK 互联导出导弹轨迹及速度数据(csv导出)

本文介绍了如何通过 MATLAB 脚本连接 STK 提取导弹三维轨迹数据,并以 CSV 格式导出,包含以下关键内容:自动连接 STK 场景;获取所有导弹对象;提取 J2000 坐标系下的位置和速度;加入任务优先级与状态;导出为标准 CSV 文件;

weixin_52370774的博客 778

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

我的博客 361

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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、付费专栏及课程。

余额充值