使用互斥锁mutex进行进程间同步的说明和示例

《UNIX环境高级编程》笔记 第十二章-线程控制 1. 线程限制 UNIX操作系统对于线程操作有一些限制。如下图所示,可以通过sysconf函数进行查询 2. 线程属性 2.1 线程属性概念 对于与线程相关的对象类型,一般都有一个属性类型与之关联(如线程和线程属性关联、互斥量和互斥量属性关联): 有一个初始化属性对象的函数,把属性设置为默认值 有一个销毁属性对象的函数,即释放属性对象资源 一个属性对象可以代表多个属性。属性对象对应用程序不透明,因此应用程序不需要了解属性对象结构实现细节,而是通过指定函数与之交互。 属性对象中的每个属性都有一个设置属性值 阅读详情

        进程间同步可以使用互斥量mutex(互斥锁)、信号量和文件锁。本文只讲进程间使用互斥量进行同步。这里面的重要函数是pthread_mutex_init(),它负责进行互斥锁的初始化,只有初始化之后才能使用它进行加锁、解锁。这里需要说明的是,mutex不仅可以用于进程间的同步,还可以用于线程间的同步,默认情况下是线程间同步。

如果要用于进程间同步,则需要在pthread_mutex_init初始化之前,修改其属性为进程间共享。pthread_mutexattr_t mattr 类型就是用于定义mutex锁的属性的。

mutex的属性修改函数主要有以下几个:

  • int pthread_mutexattr_init(pthread_mutexattr_t *attr);  初始化一个mutex属性对象;
  • int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);  修改mutex属性;参2:pshared取值:进程锁:PTHREAD_PROCESS_SHARED;  线程锁:PTHREAD_PROCESS_PRIVATE (mutex的默认属性即为线程锁,进程间私有)
  • int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 销毁mutex属性对象 (而非销毁锁)
  • int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);  即将修改后的属性传入该函数,即可产生一个进程锁。

进程间使用互斥量来实现同步的示例:

#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/mman.h>
#include <sys/wait.h>
 
struct mt {
    int num;//待保护的临界资源,一个计数
    pthread_mutex_t mutex;//互斥锁
    pthread_mutexattr_t mutexattr;//互斥锁属性对象,用于设置互斥锁
};
 
int main(void)
{
    int i;
    struct mt *mm;
    pid_t pid;
/*  文件映射方式创建映射区
    int fd = open("mt_test", O_CREAT | O_RDWR, 0777);
    ftruncate(fd, sizeof(*mm));
    mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);
    unlink("mt_test");
*/ 
    mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
    memset(mm, 0, sizeof(*mm));  //初始化内存
 
    pthread_mutexattr_init(&mm->mutexattr);         //初始化mutex属性对象
    pthread_mutexattr_setpshared(&mm->mutexattr, PTHREAD_PROCESS_SHARED);    //修改属性为进程间共享
 
    pthread_mutex_init(&mm->mutex, &mm->mutexattr);   //初始化一把mutex琐
 
    pid = fork();
    if (pid == 0) {//子进程,使用getpid()可以获取自己的进程id
        for (i = 0; i < 10; i++) {
            pthread_mutex_lock(&mm->mutex);
            (mm->num)++;
            printf("-child----------num++   %d\n", mm->num);
            pthread_mutex_unlock(&mm->mutex);
            sleep(1);
        }
    } else if (pid > 0) {//父进程,可以使用getpid()获取自己的进程id,同时可以用pid得到子进程 id。一般来说父进程需要控制子进程,所以需要子进程的pid。
        for ( i = 0; i < 10; i++) {
            sleep(1);
            pthread_mutex_lock(&mm->mutex);
            mm->num += 2;
            printf("-------parent---num+=2  %d\n", mm->num);
            pthread_mutex_unlock(&mm->mutex);
        }
        wait(NULL);//用于等待子进程结束
    }
 
    pthread_mutexattr_destroy(&mm->mutexattr);          //销毁mutex属性对象
    pthread_mutex_destroy(&mm->mutex);                //销毁mutex
    munmap(mm,sizeof(*mm));                         //释放映射区
 
    return 0;
}

输出:
[ok@~/test]# ./processMutexTest

-child----------num++   1

-------parent---num+=2  3

-child----------num++   4

-------parent---num+=2  6

-child----------num++   7

-child----------num++   8

-------parent---num+=2  10

-------parent---num+=2  12

-child----------num++   13

-------parent---num+=2  15

-child----------num++   16

-child----------num++   17

-------parent---num+=2  19

-child----------num++   20

-------parent---num+=2  22

-child----------num++   23

-------parent---num+=2  25

-child----------num++   26

-------parent---num+=2  28

-------parent---num+=2  30
注意:上述方式使用mmap,将临界资源和互斥锁放到了共享内存中,只有这样,两个进程才能同时访问到同一个资源。否则的话,两个进程无法拿到同一个mutex对象。

IDEA Prune:预训练中集成放大与剪枝融合的生成式模型压缩方法 模型压缩是NLP工程落地的关键环节,传统剪枝常导致生成式模型精度明显下降。集成放大通过多分支或多视图提升模型表达能力,其性能红利可补偿剪枝带来的损失。将两者融合进预训练流程,以“放大-剪枝”交替循环实现渐进式结构化剪枝,能显著缓解生成任务中的语义漂移和重复生成问题。该方法适用于各类生成式语言模型的训练与部署,可在保持生成质量的同时降低显存占用与推理延迟。本文基于该思路,解析集成放大与剪枝协同工作的原理,并给出注意力头剪枝的实践路径。 阅读详情

相关推荐

linux_进程锁与文件锁-pthread_mutexattr_init函数-pthread_mutexattr_setpshared函数

进程间也可以使用互斥锁 pthread_mutexattr_init函数 初始化一个mutex属性对象 pthread_mutexattr_setpshared函数 修改mutex属性 pthread_mutexattr_destroy函数 销毁mutex属性对象 (而非销毁锁) 但应在pthread_mutex_init初始化之前,修改其属性为进程间共享。线程锁取值:PTHREAD_PROCESS_PRIVATE (mutex的默认属性即为线程锁,进程间私有)锁的类型:F_RDLCK 、F_WRLCK 、

qq_44177918的博客 2393

【Linux】如何在进程间加锁(实现互斥)

进程间加锁,mmap,共享内存,信号量,管道:建议先读完这篇。进程之间如何加锁,今天我们需要实现一个售票系统,我们需要对同一个num变量++。以往我们写过类似的代码,只需要用pthread_mutex_t 这把锁就可以实现一个进程内多个线程互斥。但是我们这里改变需求,假设是你和你的同学需要抢一张票,你们在不同的主机的相同进程抢票,那么要怎么做呢?实际上我个人偏向于mmap的这种方式,因为当进程crash的时候,mmap可以保存到文件,但他和shm面临着共享内存被锁上无法使用的问题。

jhao的博客 1万+

【互斥锁与信号量】线程通信:互斥锁(mutex)与信号量(semaphore)

总的来说,互斥锁和信号量都是线程和进程同步的重要工具。互斥锁主要用于保护资源,保证同一时间只有一个线程或进程访问某一资源,从而避免并发问题。而信号量更多的是用于线程和进程之间的通信和同步,控制在一定范围内的并发访问,为程序提供更细粒度的并发控制。 掌握互斥锁和信号量的使用和区别,能极大地提高多线程和多进程编程的效率和稳定性。

crr411422的博客 3913

互斥锁可以用于不同进程的线程同步吗?

前些天在 优快云论坛上看到一个帖子,询问互斥锁 (pthread_mutex_t)是否可以用来同步不同进程的线程。 当时我的回答是不可以。 其实,更准确的答案是,不一定。 首先,互斥锁默认的情况下,只能用于进程内部的线程的同步。这也是互斥锁最常见,最标准的用法。 其次,互斥锁也确实提供了对不用进程的线程同步的支持。不过,问题是,在 POSIX规范里面,这个支持不是必须的,而是可选的。

小猪爱拱地 4379

1. C# 进程间同步机制(Mutex和EventWaitHandle)实现单一应用启动

C# 程序如何实现只有一个应用实例在运行,如果重复启动,会激活已经启动的应用

Fioman_GYM的博客 1811

WorkVisual传输程序报错_发现一个内部错误

WorkVisual传输程序报错_发现一个内部错误

qq_16401025的博客 2451

在c#中用mutex类实现线程的互斥_C# 多线程系列(4)进程同步Mutex类

Mutex 类Mutex 中文为互斥,Mutex 类叫做互斥锁。它还可用于进程间同步的同步基元。Mutex 跟 lock 相似,但是 Mutex 支持多个进程。Mutex 大约比 lock 慢 20 倍。互斥锁(Mutex),用于多线程中防止两条线程同时对一个公共资源进行读写的机制。Windows 操作系统中,Mutex 同步对象有两个状态:signaled:未被任何对象拥有;nonsi...

weixin_39940154的博客 522

clock-gating整理

文章目录clock gating 理解1、latch双稳态器件常见锁存器结构SR锁存器D锁存器2、clock gating(clock low-active) latch + AND gating 电路(clock high-active)latch + OR gating 电路 clock gating 理解 1、latch 参考:https://www.cnblogs.com/IClearner/p/6443539.html 双稳态器件 稳定状态为0或1两种 举例:交叉耦合反相器 假设初始Q为1,则可

d_b_的博客 1万+

互斥锁(mutex)

Linux中提供一把互斥锁mutex(也称之为互斥量)。 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。 但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。 但,应注意:同一时刻,只能有一个线程持有该锁。 当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程不去加锁,而直接访问该全局变量,依然能够访问,但会出...

世间所有的相遇都是久别重逢 10万+

数据产品需求文档(PRD)怎么写?阿里P8分享的模板+5个避坑点

作用:记录文档的版本、作者、评审信息,避免“文档混乱”。填写规范字段说明示例文档名称清晰反映产品名称,如“用户行为分析平台PRD”用户行为分析平台PRD_V1.0文档版本用“版本号+日期”,如V1.0_20240301编写人数据产品经理姓名+联系方式张三(138-XXXX-XXXX)评审人员业务负责人、开发经理、数据分析师、运维负责人李四(业务)、王五(开发)、赵六(数据)、周七(运维)评审时间评审日期2024-03-05评审意见。

架构师的AI之路,分享AI应用开发架构的学习与实践。 1570

在overleaf中使用bibtex引用参考文献

最近在挑选写tex的平台,挑来挑去,个人感觉overleaf给我带来的体验感是最舒适的。不过由于对内部的文件组织和make进行了一层封装,所以与一般的本地平台编译tex会有一点不同。此处写一下在overleaf中使用bibtex的方法。 在tex中使用bibtex引用文献是一件很舒适的事,毕竟这是tex的优点之一(要是tex比word难用,我干什么不去用word,hhh) 第一步,我们创建一个.bib文件,名字随便起,我这边起为reference.bib。 然后打开谷歌学术,搜索你想要引用的文章,并找到

锦恢的博客 4万+

【Linux】进程间同步(进程间互斥锁、文件锁)

一、互斥量 mutex         进程间也可以使用互斥锁 ,来达到同步的目的。但应在 pthread_mutex_init 初始化之前,修改其属性为进程间共享。mutex 的属性修改函数主要有以下几个。        主要应用函数:                1、pthread_mutexattr_t   mutexattr 类型: 用于定义互斥锁的属性。            

ARRAYLI_博客 3万+

AUTOSAR进阶图解==>AUTOSAR_SWS_CANNetworkManagement

本文介绍了AUTOSAR架构中的CAN网络管理(CanNm)模块,主要内容包括: 模块概述:CanNm是协调CAN网络节点状态转换的基础组件,采用去中心化设计,通过周期性发送网络管理PDU保持网络活跃状态,支持网络唤醒、睡眠和部分网络功能。 架构设计:CanNm位于AUTOSAR中间层,连接上层通信管理器(ComM)和底层CAN接口(CanIf),包含状态管理、PDU处理和定时器管理等子组件。 状态机设计:定义了三种主要模式(总线睡眠、准备睡眠和网络模式)及其转换逻辑,网络模式又包含重复消息、正常操作和准备

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 2037

多线程互斥锁 pthread_mutex 的使用及初始化问题

互斥锁 pthread_mutex 的使用及注意事项

咸鱼弟的博客 2万+

语义分割(Semantic Segmentation)近年发展综述

目标:为图像中每个像素分配一个语义类别标签(如“道路”、“行人”、“天空”),不区分同类实例。关键挑战精确边界恢复(高空间分辨率)全局上下文理解(大感受野)计算效率与精度平衡小样本/弱监督泛化语义分割的十年演进,是一条从专用→通用、封闭→开放、慢速→实时、像素→语义2015:FCN/U-Net 奠基;2018:DeepLabv3+/PSPNet 实现高精度;2020:HRNet+OCR 登顶竞赛;2021:SegFormer 开启 Transformer 新纪元;2023+

浩瀚之水的专栏 976

2024 全国大学生新质生产力大赛 B:金融违规交易的大数据分析 问题四思路代码

问题四:请分析附件中所有的指标数据,选取合适的指标,建立“金融违规 洗钱交易的预测模型”,并选取合适的训练集和测试集,计算预测模型的准确率。 为了提前识别并预测金融违规洗钱的交易事件,请基于你们团队数据分析的结果, 分别给公安部门和银行机构提出你们的建议。

YOLO 374

基于多进程并发-进程同步之互斥锁(Mutex)

所有句柄都被关闭后,操作系统就会删除对象,进程中止前,一定要ReleaseMutex释放互斥体,如未释放,这个互斥体会被标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序,也许仍然能够用它,但会收到一个废弃状态信息,指出上一个拥有它的进程,未能正常关闭。ReleaseMutex()让调用进程释放对该互斥体的拥有权,此时另一个在等待该mutex的线程,将得到信号停止等待(wait函数)。关闭一个句柄,并将这个句柄的引用计数减一,如果句柄的引用计数减到0,那么操作系统将释放这个核心对象的句柄。

qq_43148810的博客 2657

华为OD机试真题2025双机位B卷 Java&Go 实现【朋友圈个数】

给定一组朋友关系,统计一下该朋友关系网中的朋友圈个数。 朋友圈的定义:一个朋友圈至少由3个朋友组成,且要求同一个朋友圈中的任意两个人都具有直接的朋友关系。 输入描述 输入一个朋友关系列表,如 Fiends =A.B],[A.C],IB,DI,其中的每一个元素 Friendsi表示 Friends[i][0)和 Friends [i][1] 是朋友关系 先输入一个数字 N 代表关系的总数,后面每条关系一行,两个成员以逗号分隔

MISAYAONE的博客 516

Pthread线程 —— 多线程同步 互斥锁(mutex)

多线程的同步机制  对于多线程程序来说,同步(synchronization)是指在一定的时间内只允许某一个线程访问某个资源 。而在此时间内,不允许其它的线程访问该资源。Linux下提供了多种方式来处理线程同步,最常用的是互斥锁(mutex)、条件变量(condition variable)和信号量(sem)。互斥锁(mutex)  互斥锁是一个特殊的变量,它有锁上(lock)和打开(unlock)

J.Zz 的博客 5804

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

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

linux互斥锁(pthread_mutex)知识点总结

linux互斥锁(pthread_mutex)知识点总结

wei_Embedded_z的博客 6389

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux线程同步方式1——互斥锁(mutex)

互斥锁(mutex)互斥体互斥锁1、定义2、属性3、使用流程(相关API函数)pthread_mutex_init()1、定义2、函数原型:3、返回值:4、初始化方式pthread_mutex_destroy()1、定义2、函数原型pthread_mutex_lock()(阻塞)1、定义2、函数原型3、基于mutex类型的返回值pthread_mutex_unlock()1、定义2、函数原型互斥锁应用举例参考 互斥体 互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥

JMW1407的博客 1566

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言互斥锁pthread_mutex_t

在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。 一,锁的创建     锁可以被动态或静态创建,可以用宏PTHRE

1万+

C#互斥锁Mutex类的用法

C#互斥锁Mutex类的简单用法作用用法代码相关链接 作用 C#中Mutex是互斥锁,位于System.Threading命名空间中。 顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。 如果当前有一个线程拥有它,在没有释放之前,其它线程是没有权利拥有它的。我们可以把Mutex看作洗手间,上厕所的人看作线程;上厕所的人先进洗手间,拥有使用权,上完厕所之后出来,把洗手间释放,其他人才可以使用。 用法 线程使用Mutex.WaitOne()方法等待C#Mutex对象

天富儿的博客 1353

mutex互斥锁属性说明

mutex互斥锁属性 版权声明:本文为优快云博主「一缕阳光a」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.youkuaiyun.com/zgaoq/article/details/54926915 在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mut

meetyanfei的博客 796

30.C++11之线程同步互斥锁mutex

在 C++11 中引入了标准的线程库,其中互斥锁(mutex)是线程同步的重要工具,用于保护共享资源,防止多个线程同时访问和修改这些资源而导致的数据竞争问题。下面从多个方面详细介绍 C++11 中的互斥锁。

qq_56402998的博客 1089
上一篇: 关于inotify监控mmap内存映射或共享内存相关变动的做法
下一篇: Posix共享内存
土豆西瓜大芝麻
博客等级 码龄18年 1189粉丝 238原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值