Linux应用 线程同步之互斥锁

1、概念

1.1 定义

互斥锁(Mutex),又称互斥型信号量,是一种特殊的二值性信号量,主要用于实现对共享资源的独占式处理。任意时刻,互斥锁的状态只有两种:开锁或闭锁。当有任务持有时,互斥锁处于闭锁状态,这个任务获得该互斥锁的所有权;当该任务释放它时,互斥锁被开锁,任务失去所有权。在一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有。

1.2 应用场景

  • 保护共享资源:最常见的应用场景是保护共享资源,确保多个线程不会同时访问共享资源而导致数据竞争和不一致性。
  • 临界区保护:在多线程环境下,需要保护临界区(一段代码或数据结构)不被多个线程同时访问,互斥锁可以用来实现临界区的保护。
  • 线程同步:互斥锁也可以用于线程之间的同步,确保线程按照一定的顺序访问共享资源,避免竞争条件和死锁。

2、常用接口

2.1 pthread_mutex_init

初始化互斥锁对象。

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  • 入参:
    • mutex:指向互斥锁对象的指针。
    • attr:指向互斥锁属性对象的指针,通常传入NULL。
  • 返回值:若成功,返回0;否则返回错误码。

2.2 pthread_mutex_lock

加锁,尝试获取互斥锁。

int pthread_mutex_lock(pthread_mutex_t *mutex);
  • 入参:
    • mutex:指向互斥锁对象的指针。
  • 返回值:若成功,返回0;否则返回错误码。

2.3 pthread_mutex_unlock

解锁,释放互斥锁。

int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • 入参:
    • mutex:指向互斥锁对象的指针。
  • 返回值:若成功,返回0;否则返回错误码。

2.4 pthread_mutex_destroy

销毁互斥锁对象。

  • 入参:
    • mutex:指向互斥锁对象的指针。
  • 返回值:若成功,返回0;否则返回错误码。

3、编程测试

示例中,定义了一个全局共享变量shared_resource,两个线程都会对这个变量进行增加操作。我们使用pthread_mutex_t类型的变量mutex作为互斥锁。在thread_function函数中,线程首先使用pthread_mutex_lock函数获取互斥锁,然后执行对共享资源的访问操作,最后使用pthread_mutex_unlock函数释放互斥锁。这样,当一个线程持有锁时,其他线程将无法获取锁,从而确保了同一时间只有一个线程能够访问共享资源。

main函数中,我们首先使用pthread_mutex_init函数初始化互斥锁,然后创建两个线程。我们使用pthread_create函数创建线程,并将thread_function作为线程函数。接着,我们使用pthread_join函数等待线程结束。最后,我们使用pthread_mutex_destroy函数销毁互斥锁,并输出共享资源的最终值。

当不使用互斥锁的时候代码如下:

#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  // 全局共享变量  
int shared_resource = 0;  // 互斥锁  
pthread_mutex_t mutex;  // 线程函数  
void* thread_function(void* arg) 
{  // 锁定互斥锁  // pthread_mutex_lock(&mutex);  // 访问共享资源  for (int i = 0; i < 100000; i++) {  shared_resource++;  }  // 解锁互斥锁  // pthread_mutex_unlock(&mutex);  return NULL;  
}  int main() {  // 初始化互斥锁  if (pthread_mutex_init(&mutex, NULL) != 0) {  printf("Mutex initialization failed\n");  return 1;  }  // 创建两个线程  pthread_t thread1, thread2;  if (pthread_create(&thread1, NULL, thread_function, NULL) != 0) {  printf("Thread 1 creation failed\n");  return 1;  }  if (pthread_create(&thread2, NULL, thread_function, NULL) != 0) {  printf("Thread 2 creation failed\n");  return 1;  }  // 等待线程结束  pthread_join(thread1, NULL);  pthread_join(thread2, NULL);  // 销毁互斥锁  pthread_mutex_destroy(&mutex);  // 输出共享资源的最终值  printf("Shared resource value: %d\n", shared_resource);  return 0;  
}

测试发现两个线程访问同一个变量造成结果不可控:

放开代码中关于互斥锁的注释,测试代码如下:

#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  // 全局共享变量  
int shared_resource = 0;  // 互斥锁  
pthread_mutex_t mutex;  // 线程函数  
void* thread_function(void* arg) 
{  // 锁定互斥锁  pthread_mutex_lock(&mutex);  // 访问共享资源  for (int i = 0; i < 100000; i++) {  shared_resource++;  }  // 解锁互斥锁  pthread_mutex_unlock(&mutex);  return NULL;  
}  int main() {  // 初始化互斥锁  if (pthread_mutex_init(&mutex, NULL) != 0) {  printf("Mutex initialization failed\n");  return 1;  }  // 创建两个线程  pthread_t thread1, thread2;  if (pthread_create(&thread1, NULL, thread_function, NULL) != 0) {  printf("Thread 1 creation failed\n");  return 1;  }  if (pthread_create(&thread2, NULL, thread_function, NULL) != 0) {  printf("Thread 2 creation failed\n");  return 1;  }  // 等待线程结束  pthread_join(thread1, NULL);  pthread_join(thread2, NULL);  // 销毁互斥锁  pthread_mutex_destroy(&mutex);  // 输出共享资源的最终值  printf("Shared resource value: %d\n", shared_resource);  return 0;  
}

测试结果如下,实现对变量的保护:

4、总结

本文讲解了linux线程同步中使用的互斥锁的概念的定义和应用场景,列举了常用的编程接口,并编写测试用例进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旧衣服回收小程序开发,“互联网+”模式下巨大收益

近年来&#xff0c;在人们生活水平的提高下&#xff0c;旧衣物随之增加&#xff0c;如何处理旧衣服成为了当下大众所困扰的问题。 当下&#xff0c;旧衣回收行业已经成为了一个新的热门行业&#xff0c;我国人口众多&#xff0c;旧衣物的市场规模也在不断扩大&#xff0c;市场…

基于springboot+vue的房屋交易平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Greetings

Problem - 1915F - Codeforces 题意 给一些(l,r)找到所有能够包含(l,r)的数目 引入 也就是找逆序对个数 要用到归并排序中的思想&#xff1a; //https://www.luogu.com.cn/problem/P1216 #include<iostream> #include<cstdio> #include<stack> #include…

python面向对像之第二次笔记

python面向对像 一、面向对象的三大特性面向对象包含3大主要特性&#xff1a;封装私有成员继承复写 pass关键字多态 总结 一、面向对象的三大特性 面向对象包含3大主要特性&#xff1a; 封装 封装是面向对象编程中的一个重要概念&#xff0c;它指的是将数据&#xff08;属性&a…

STM32信息安全 1.2 课程架构介绍:芯片生命周期管理与安全调试

STM32信息安全 1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&…

记一些有关Element Plus的样式修改

先记一个放着&#xff0c;后续慢慢补充。。。 一个 Vue 3 UI 框架 | Element Plus Radio 单选框 1、去除radio的圆圈 .box-radio {/deep/ .el-radio__input {display: none;} }

【QT入门】VS2019和QT Creator如何添加第三方模块

声明&#xff1a;该专栏为本人学习Qt知识点时候的笔记汇总&#xff0c;希望能给初学的朋友们一点帮助(加油&#xff01;) 往期回顾&#xff1a; 【QT入门】什么是qt&#xff0c;发展历史&#xff0c;特征&#xff0c;应用&#xff0c;QtCreator-CSDN博客 【QT入门】Windows平台…

模方信创版正式上线!支持水面一键修复、道路置平、纹理编辑...

现在国家大力推进信创国产化软硬件替代的政策背景下&#xff0c;大势智慧重磅发布模方信创版&#xff0c;以满足用户对在信创环境下进行实景三维模型修饰与编辑的需求。 模方信创版与重建大师信创版、DasViewer信创版一道&#xff0c;构筑起三维重建信创生态的“铁三角”&…

Unity PS5开发 天坑篇 之 DEVKit环境部署与系统升级02

上一篇各位大神们已经收到了SONY官方免费寄送的PS5开发机与测试机&#xff0c;恭喜大家成为SONY的开发者, 本篇继续PS5开发机的部署与开发套件使用。 一, PC安装PS5 SDK与系统升级 1. PC/PS5 SDK Manager下载安装包 登录开发者账号后&#xff0c;Development->Resources&a…

挑战杯 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…

Linux系统——测试磁盘IOPS性能

目录 引言 一、IOPS指标受到的影响因素 二、提高IOPS性能的措施 三、测试IOPS性能命令 1.fio工具 2.ioping工具 引言 磁盘IOPS是指磁盘每秒钟可以完成的输入/输出操作数。它是衡量磁盘性能的一个重要指标&#xff0c;尤其对于需要处理大量随机读写操作的应用程序&…

B010-springcloud alibaba 分布式事务 Seata

目录 分布式事务基础事务本地事务分布式事务分布式事务的场景 分布式事务解决方案全局事务/两阶段提交可靠消息服务最大努力通知TCC事务 Seata介绍Seata实现分布式事务控制案例基本代码修改order微服务OrderSeataControllerOrderServiceImpl5注释容错相关代码ProductClient 修改…

C#语法基础

1. C#语言及其特点 C#是微软公司发布的一种面向对象、运行于.NET Framework和.NET Core&#xff08;完全开源&#xff0c;跨平台&#xff09;之上的最高级程序设计语言。C#是一种安全的、稳定的、简单的、优雅的&#xff0c;由C和C衍生出来的面向对象的程序语言。它在继承C和C…

IPSEC VPN-详解原理

目录 IPSEC提供的安全服务 IPSEC协议簇 ​编辑 安全协议 1.传输模式 2. 隧道模式 AH ---鉴别头协议 AH提供的安全服务&#xff1a; AH头部 AH的保护范围 1.传输模式 2.隧道模式 ​编辑 ESP ---封装安全载荷协议 ESP提供的安全服务&#xff1a; ESP的头部 ESP的保护范围 1.传输…

数据库国产化探究及升级改造过程指导

一、背景 在信创“自主可控”的浪潮下&#xff0c;政企行业首当其冲&#xff0c;基于国产化信创的要求&#xff0c;本部门某业务后端应用也需要针对分析开源组件的风险和开源协议的商业应用限制&#xff1b;能用国产化替代的评估后尽可替代割接&#xff0c;本期针对传统数据库…

22、设计模式之状态模式(State)

一、什么是状态模式 状态模式是一种行为型设计模式。它允许对象在内部状态发生改变时改变它的行为&#xff0c;简单地讲就是&#xff0c;一个拥有状态的context对象&#xff0c;在不同状态下&#xff0c;其行为会发生改变。 二、角色组成 上下文&#xff08;Context&#xff0…

【Leetcode-54.螺旋矩阵】

题目&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1…

从单机到分布式微服务,大文件校验上传的通用解决方案

一、先说结论 本文将结合我的工作实战经历&#xff0c;总结和提炼一种从单体架构到分布式微服务都适用的一种文件上传和校验的通用解决方案&#xff0c;形成一个完整的方法论。本文主要解决手段包括多线程、设计模式、分而治之、MapReduce等&#xff0c;虽然文中使用的编程语言…

外包干了3个月,技术明显进步。。。。。

在湖南的一个安静角落&#xff0c;我&#xff0c;一个普通的大专生&#xff0c;开始了我的软件测试之旅。四年的外包生涯&#xff0c;让我在舒适区里逐渐失去了锐气&#xff0c;技术停滞不前&#xff0c;仿佛被时间遗忘。然而&#xff0c;生活的转机总是在不经意间降临。 与女…

VMware安装Centos 7系统+设置共享文件夹+VMware Tools安装

文章目录 镜像下载地址下载页自己选择直接点击下边url下载 VMware环境1.新建虚拟机2.选择“自定义(高级)”&#xff0c;并点击【下一步】3.选择虚拟机硬件兼容性&#xff0c;并点击【下一步】4.选择“稍后安装操作系统”&#xff0c;并点击【下一步】5.选择操作系统版本&#x…