Linux 中 POSIX 互斥信号量(互斥锁)的使用

目录

  • 一、互斥锁的介绍
  • 二、使用方法
  • 三、测试代码

一、互斥锁的介绍

  在Linux系统中,特别是在ARM架构的嵌入式系统中,互斥量(Mutex)用于保护共享资源不被多个线程或任务同时访问,从而防止数据竞争和不一致性。
POSIX 互斥信号量的类型为 pthread_mutex_t。使用时需要定义一个 pthread_mutex_t 类型的变量,如:

pthread_mutex_t mutex;

二、使用方法

  互斥量是一个对象,它可以被锁定(locked)和解锁(unlocked)。当一个线程或任务锁定了一个互斥量时,其他任何试图锁定该互斥量的线程或任务都将被阻塞,直到该互斥量被解锁。
①初始化:在使用互斥量之前,必须对其进行初始化。这通常是通过调用一个特定的函数(如pthread_mutex_init)来完成的。
②锁定与解锁:当线程或任务需要访问共享资源时,它应该首先锁定互斥量,使用pthread_mutex_lock 函数,如果互斥量已经被另一个线程或任务锁定,则当前线程或任务将被阻塞,直到互斥量被解锁。访问完共享资源后,线程或任务应该解锁互斥量,使用 pthread_mutex_unlock 函数,以便其他线程或任务可以访问它。
③销毁:当不再需要互斥量时,应该销毁它,以释放与之关联的资源。这通常是通过调用一个特定的函数(如pthread_mutex_destroy)来完成的。
④类型:在POSIX线程(pthreads)库中,有两种主要的互斥量类型,分别是正常互斥量(normal mutex)和递归互斥量(recursive mutex)。正常互斥量不允许同一个线程多次锁定它,而递归互斥量则允许。
  一个 POSIX 互斥信号量使用以前必须首先进行初始化,可以把 mutex 初始值设置为PTHREAD_MUTEX_INITIALIZER(静态初始化),也可以调用 pthread_mutex_init 函数进行动态初始化。
  线程如果需要等待一个互斥信号量,可以调用pthread_mutex_lock 函数。释放一个互斥信号量使用 pthread_mutex_unlock 函数。
  当一个互斥信号量使用完毕后,应该调用 pthread_mutex_destroy 函数将其删除。需要注意的是,如果试图再次使用一个被删除的信号量,将出现未知的错误。
在这里插入图片描述

三、测试代码

#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  
#include <sys/types.h>
#include <unistd.h>// 定义一个全局变量作为共享资源  
int counter = 0;  // 定义一个互斥量用于保护counter  
pthread_mutex_t mutex;  // 无参 线程函数,用于增加counter的值  
/*
void* increment_counter(void* arg) {  pid_t		pid;pthread_t	tid;pid = getpid();tid = pthread_self();for (int i = 0; i < 5; i++) {  // 锁定互斥量  pthread_mutex_lock(&mutex); counter++;  printf("pid %lu tid %lu (0x%lx)\n", (unsigned long)pid,(unsigned long)tid, (unsigned long)tid);printf("counter = %d\r\n",counter); // 解锁互斥量  pthread_mutex_unlock(&mutex);  }  return NULL;  
}  
*/// 有参 线程函数,用于增加counter的值
void* increment_counter(void* arg) { int tmp = *(int *)arg; for (int i = 0; i < 5; i++) {  // 锁定互斥量  pthread_mutex_lock(&mutex); counter++;  printf("num = %d \r\n",tmp);printf("counter = %d \r\n",counter); // 解锁互斥量  pthread_mutex_unlock(&mutex);  }  return NULL;  
} int main() {  // 初始化互斥量  pthread_mutex_init(&mutex, NULL);  // 创建两个线程,每个线程都会增加counter的值  pthread_t thread1, thread2;  //无参//pthread_create(&thread1, NULL, increment_counter, NULL);  //pthread_create(&thread2, NULL, increment_counter, NULL);  //有参 int num1=1;int num2=2;pthread_create(&thread1, NULL, increment_counter, &num1);  pthread_create(&thread2, NULL, increment_counter, &num2);  // 等待两个线程完成  pthread_join(thread1, NULL);  pthread_join(thread2, NULL);  // 打印最终的counter值(应该是10)  printf("Final counter value: %d\n", counter);  // 销毁互斥量  pthread_mutex_destroy(&mutex);  return 0;  
}

测试结果,如下:
在这里插入图片描述

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

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

相关文章

旅游组团奖励标准,申报条件!利川市旅游组团奖励办法

利川市旅游组团奖励有哪些&#xff1f;关于利川市旅游组团奖励标准&#xff0c;申报条件整理如下&#xff1a; 第一条根据《湖北省人民政府办公厅印发关于更好服务市场主体推动经济稳健发展若干政策措施的通知》&#xff08;鄂政办发〔2022〕54号&#xff09;、《恩施州人民政府…

一个完整性能测试流程(非常详细)零基础入门到精通,收藏这一篇就够了

一、性能测试流程规范化的意义 规范化的性能测试流程能帮助测试发现潜在的性能问题和瓶颈&#xff0c;也能确保性能测试的可重复性和可比性。 同时可以帮助确定系统的容量&#xff0c;降低风险及维护成本&#xff0c;提高用户体验和满意度。 二、性能测试流程 一&#xff09…

linux高性能服务器--Ngix内存池简单实现

文章目录 内存模型&#xff1a;流程图内存对齐code 内存模型&#xff1a; 流程图 内存对齐 对齐计算 要分配一个以指定大小对齐的内存&#xff0c;可以使用如下公式&#xff1a; 假设要分配大小为n&#xff0c;对齐方式为x&#xff0c;那么 size(n(x-1)) & (~(x-1))。 举个…

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之&#xff1a;gemm/threadblock/threadblock_swizzle.h 文件夹讲解&#xff0c;cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之&#xff1a;gemm/th…

InfiniGate自研网关实现四

13.服务发现组件搭建和注册网关连接 以封装 api-gateway-core 为目的&#xff0c;搭建 SpringBoot Starter 组件&#xff0c;用于服务注册发现的相关内容处理。 这里最大的目的在于搭建起用于封装网关算力服务的 api-gateway-core 系统&#xff0c;提供网关服务注册发现能力。…

【Python技术】使用akshare、pandas高效复盘每日涨停板行业分析

作为一个程序员宝爸&#xff0c;每天的时间很宝贵&#xff0c;工作之余除了辅导孩子作业&#xff0c;就是补充睡眠。 怎么快速高效的进行当天A股涨停板的复盘&#xff0c;便于第二天的跟踪。这里简单写个示例&#xff0c; 获取当天连涨数排序&#xff0c;以及所属行业排序。 …

ICode国际青少年编程竞赛- Python-2级训练场-迷宫

ICode国际青少年编程竞赛- Python-2级训练场-迷宫 1、 Dev.step(3) Dev.turnLeft() for i in range(2):Dev.step(4)Dev.turnRight() for i in range(2):Dev.step(2)Dev.turnLeft() Dev.step(3) Dev.step(-9)2、 Dev.step(3) Dev.turnRight() Dev.step(2) Dev.turnLeft() for i …

TCP及IP协议

TCP协议的传输是可靠的&#xff0c;而UDP协议的传输“尽力而为” TCP传输可靠性———确认&#xff0c;重传&#xff0c;排序&#xff0c;流控。 流控&#xff1a;滑动窗口机制 TTL--- 数据包每经过一个路由器的转发&#xff0c;他的TTL值将减1&#xff0c;当一个数据包中的T…

01-01-11

1、day11作业 使用的代码 #include<stdio.h> #include<stdlib.h> int main() {int i;//申请多大的空间scanf("%d", &i);char* p (char*)malloc(i);//不进行强制类型转换&#xff0c;会产生警告char c;scanf("%c", &c);//清空上面申请…

AutoDL服务器远程桌面

文章目录 1.安装VNC和必要的一些图形显式库:2.SSH隧道2.1.本地安装openssh服务器2.2.服务开启2.3.显示当前安装的 SSH 版本信息2.3.设置一个 SSH 隧道 注意3.VNC Viewer客户端登录4.测试5.参考 VNC&#xff08;Virtual Network Computing &#xff09;是一种图形化的桌面共享协…

python实现背单词程序

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.分析 一.前言 背单词是学习英语的一个重要环节,它有很多好处,以下是其中一些主要的好处: 提高词汇量

机器学习各个算法的优缺点!(下篇) 建议收藏。

上篇地址&#xff1a;机器学习各个算法的优缺点&#xff01;&#xff08;上篇&#xff09; 建议收藏。-CSDN博客 直接进入主题。 目录 6.降维算法 7.聚类算法 8.贝叶斯算法 9.人工神经网络 10.深度学习 谢谢观看。 6.降维算法 降维算法是一类用于减少数据维度的技术。 …

C++容器——stack

stack容器 C的std::stack容器是一个基于适配器模板类实现的容器适配器&#xff0c;它提供了一种后进先出的数据结构&#xff0c;即栈。 特点&#xff1a; 1.后进先出&#xff1a;元素在栈容器中按照后进先出的顺序管理&#xff0c;最后放入的元素将会最先被取出。 2.只能从栈…

盲盒一番赏小程序:探索未知,开启神秘宝藏之旅

开启神秘之门&#xff0c;探索未知的乐趣 在繁忙的生活中&#xff0c;我们渴望一丝丝未知带来的惊喜与乐趣。盲盒一番赏小程序&#xff0c;正是为了满足您这种探索未知的欲望而诞生。它不仅仅是一个购物平台&#xff0c;更是一个充满神秘与惊喜的宝藏世界。 精选好物&#xf…

诊所医院超常规运营管理思维课程

本课程旨在引领医疗机构管理者超越传统思维&#xff0c;探索创新运营管理策略。学员将学习领先的医疗管理理念、创新的运营模式&#xff0c;以及如何应对挑战和变革。课程内容涵盖战略规划、资源优化、服务创新等&#xff0c;帮助管理者提升运营效率&#xff0c;提供更优质的医…

【SpringBoot整合系列】SpringBoot整合RabbitMQ-基本使用

目录 SpringtBoot整合RabbitMQ1.依赖2.配置RabbitMQ的7种模式1.简单模式&#xff08;Hello World&#xff09;应用场景代码示例 2.工作队列模式&#xff08;Work queues&#xff09;应用场景代码示例手动 ack代码示例 3.订阅模式&#xff08;Publish/Subscribe&#xff09;应用…

远程开机与远程唤醒BIOS设置

远程开机与远程唤醒BIOS设置 在现代计算机应用中&#xff0c;远程管理和控制已成为许多企业和个人的基本需求。其中&#xff0c;远程开机和远程唤醒是两项非常实用的功能。要实现这些功能&#xff0c;通常需要在计算机的BIOS中进行一些特定的设置。以下是对远程开机和远程唤醒…

VS2019下使用MFC完成科技项目管理系统

背景&#xff1a; &#xff08;一&#xff09;实验目的 通过该实验&#xff0c;使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识&#xff0c;熟练应用数据库知识&#xff0c;通过处理过程对计算机软件系统工作原理的进一步理解&…

Python批量备份华为设备配置到FTP服务器

Excel表格存放交换机信息&#xff1a; 备份文件夹效果图&#xff1a; Windows系统配置计划任务定时执行python脚本&#xff1a; Program/script&#xff1a;C:\Python\python.exe Add arguments (optional)&#xff1a; D:\Python_PycharmProjects\JunLan_pythonProje…

verilog中输入序列不连续的序列检测

编写一个序列检测模块&#xff0c;输入信号端口为data&#xff0c;表示数据有效的指示信号端口为data_valid。当data_valid信号为高时&#xff0c;表示此刻的输入信号data有效&#xff0c;参与序列检测&#xff1b;当data_valid为低时&#xff0c;data无效&#xff0c;抛弃该时…