当前位置: 首页 > news >正文

Linux--互斥锁

一、与互斥锁相关api

**互斥量(mutex)**从本质上来说是一把锁。在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量。对互斥量进行枷锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变成可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。
1、创建及销毁互斥锁

#include <pthread.h>int pthread_mutex_init(pthread_mutex_t * restrict mutex, const pthread_mutexattr_t *restrict attr);
//初始化锁
//指针,锁的属性,
int pthread_mutex_destroy(pthread_mutex_t mutex);
//销毁锁
//返回:若成功返回0,否则返回错误编号/*互斥量用pthread_mutex_t数据类型表示。在使用互斥量前必须对它进行初始化,可以通过调用pthread_mutex_init函数进行初始化。如果动态地分配互斥量(例如通过调用malloc函数),那么在释放内存前需要调用 pthread_mutex_destroy.
要用默认的属性初始化互斥量,只需要把attr设置为NULL。
*/

2、加锁及解锁:

#include <pthread.h>int pthread_mutex_lock(pthread_mutex_t mutex);
//上锁
int pthread_mutex_trylock(pthread_mutex_t mutex);
int pthread_mutex_unlock(pthread_mutex_t mutex);
//解锁/* 如果线程不希望被阻塞,它可以使用pthread_mutex_trylock尝试对互斥量进行加锁。如果调用pthread_mutex_trylock时互斥量处于未锁住状态,那么pthread_mutex_trylock将锁住互斥量,不会出现阻塞并返回0,否则pthread_mutex_trylock就会失败,不能锁住互斥量,而返回EBUSY。
*/

3、例:

//互斥锁#include <stdio.h>
#include <pthread.h>int g_data = 0;pthread_mutex_t mutex;//创建锁void *func1(void *arg)
{pthread_mutex_lock(&mutex);//上锁printf("t1: %ld thread is create!\n",(unsigned long)pthread_self());printf("t1: param is %d \n",*((int *)arg));pthread_mutex_unlock(&mutex);//解锁
}void *func2(void *arg)
{pthread_mutex_lock(&mutex);//上锁printf("t2: %ld thread is create!\n",(unsigned long)pthread_self());printf("t2: param is %d \n",*((int *)arg));pthread_mutex_unlock(&mutex);//解锁
}int main()
{int ret;int param = 100;pthread_t t1;pthread_t t2; pthread_mutex_init(&mutex,NULL);//初始化锁int *pret = NULL;//创建线程ret = pthread_create(&t1,NULL,func1,(void *)&param);//调用func1函数if(ret == 0){printf("main: create t1 success! \n");}ret = pthread_create(&t2,NULL,func2,(void *)&param);//调用func2函数if(ret == 0){printf("main: create t2 success! \n");}printf("main: %ld\n",(unsigned long)pthread_self());//等待pthread_join(t1,(void **)&pret);pthread_join(t2,(void **)&pret);pthread_mutex_destroy(&mutex);//销毁锁return 0;
}

给t1 上锁后,t2不会运行,等t1完成后才会继续

二、互斥锁限制共享资源的访问

1、

//互斥锁限制共享资源的访问#include <stdio.h>
#include <pthread.h>int g_data = 0;pthread_mutex_t mutex;void *func1(void *arg)
{printf("t1: %ld thread is create!\n",(unsigned long)pthread_self());printf("t1: param is %d \n",*((int *)arg));pthread_mutex_lock(&mutex);		//加锁while(1){printf("t1: %d\n",g_data++);sleep(1);if(g_data == 3){pthread_mutex_unlock(&mutex);		//删除锁printf("-----------t1 quit !----------");pthread_exit(NULL);//exit(0); 退出整个进程}}}void *func2(void *arg)
{printf("t2: %ld thread is create!\n",(unsigned long)pthread_self());printf("t2: param is %d \n",*((int *)arg));while(1){printf("t2: %d\n",g_data);pthread_mutex_lock(&mutex);g_data++;pthread_mutex_unlock(&mutex);sleep(1);}
}int main()
{int ret;int param = 100;pthread_t t1;pthread_t t2;pthread_mutex_t init(&mutex,NULL);int *pret = NULL;//创建线程ret = pthread_create(&t1,NULL,func1,(void *)&param);//调用func1函数if(ret == 0){printf("main: create t1 success! \n");}ret = pthread_create(&t2,NULL,func1,(void *)&param);//调用func1函数if(ret == 0){printf("main: create t2 success! \n");}printf("main: %ld\n",(unsigned long)pthread_self());while(1){printf("main: %d\n",g_data);sleep(1);}//等待pthread_join(t1,(void **)&pret);pthread_join(t2,(void **)&pret);pthread_mutex_destroy (&mutex);return 0;
}

结束进程:

这里是引用
ps -aux |grep a.out //查看pid
kill pid //杀死进程

2、死锁
在加了两个锁的前提下,当线程A获得一把锁时,想要获得另外一把锁,线程B想要拿到对方手里的锁时,都不可以向下解锁,就会造成死锁。

资源参考地址: https://www.cnblogs.com/xiehongfeng100/p/4620852.html

相关文章:

Linux--互斥锁

一、与互斥锁相关api **互斥量&#xff08;mutex&#xff09;**从本质上来说是一把锁。在访问共享资源前对互斥量进行加锁&#xff0c;在访问完成后释放互斥量。对互斥量进行枷锁后&#xff0c;任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释…...

[2023.09.21]:源码已上传,供大家了解Rust Yew的前后端开发

这个资源是Rust的源代码压缩包&#xff0c;供大家了解Rust Yew的前后端开发。 资源中的代码非常简洁易懂&#xff0c;虽然离商用场景还有一段距离&#xff0c;但是涵盖了前端的组件搭建、事件通信和反向代理&#xff0c;以及后端的Restful API的路由、功能实现和数据库访问。此…...

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 1.分解效果图 &#xff0…...

linux缓存-利用缓存提高性能的编程技巧

目录 利用缓存提高性能的编程技巧 实现方式 利用缓存提高性能的编程技巧 利用GCC编译器对齐属性 __attribute__((__aligned__(n))),利用处理器的缓存提高程序的执行速度&#xff1b; 使变量的起始地址对齐到一级缓存行长度的整数倍&#xff1b;使结构体对齐到一级缓存行长度…...

Socks5代理、IP代理与其在爬虫开发中的应用

在当今数字化时代&#xff0c;网络安全和数据获取变得愈发重要。代理服务器作为一种关键的技术手段&#xff0c;为网络工程师和爬虫开发人员提供了有力的工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和爬虫应用中的角色与意义。 1. 代理服务器简介 代理服务器是…...

【C++】C++继承——切片、隐藏、默认成员函数、菱形

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】STL…...

WebGL笔记:WebGL中绘制圆点,设定透明度,渲染动画

WebGL 绘制圆点 基于片元着色器来画圆形片元着色器在屏幕中画图是基于一个个的像素的每次画一个像素时&#xff0c;都会执行片元着色器中的main方法那么&#xff0c;我们就可以从这一堆片元中(n个像素点)找出属于圆形的部分片元的位置叫做 gl_PointCoord (一个点中片元的坐标位…...

华为云云耀云服务器L实例评测 | 实例使用教学之简单使用:通过命令行管理华为云云耀云服务器

华为云云耀云服务器L实例评测 &#xff5c; 实例使用教学之简单使用&#xff1a;通过命令行管理华为云云耀云服务器 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀云服务…...

微信小程序 课程签到系统

目录 前端页面展示主页面我的课程个人中心评论功能签到功能课程绑定超级管理员页面 前端文件结构文件结构app.json前端架构和开发工具前端项目地址 后端后端架构后端项目地址 注意事项 前端页面展示 主页面 登录页面&#xff1a; 账号是&#xff1a;用户名或者手机号 密码是&a…...

如何用Postman做接口自动化测试

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成…...

支付宝电脑网站支付,异步通知

一&#xff1a;异步通知是支付宝回调商户的服务器&#xff0c;所以这个地址需要通过外网访问&#xff0c;在真实项目中都会有对应的服务器&#xff0c;但是在测试中只有使用内网穿透工具 推荐使用NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 配置好内网穿透之后不要忘记…...

【广州华锐互动】奶牛养殖难产助产3D沉浸式教学平台

在传统的奶牛难产助产教学中&#xff0c;主要依赖理论知识和2D图像来进行教学。然而&#xff0c;这种教学方式往往无法全面、真实地展示奶牛难产的各种情况&#xff0c;教学效果也不尽如人意。随着科技的发展&#xff0c;3D互动教学的出现&#xff0c;为奶牛难产助产教学带来了…...

IDEA社区版,真香!

IDEA&#xff08;IntelliJ IDEA&#xff09;是众多 Java 开发者的首选。 商业版的昂贵 IDEA 商业版&#xff08;IntelliJ IDEA Ultimate&#xff09;功能非常强大&#xff0c;能够满足 Java 开发的所有需求&#xff0c;但其高昂的价格…… 此时只能感叹&#xff0c;不是不想用…...

SpringBoot实现全局异常处理

1.全局异常处理介绍 1.1 简介 全局异常处理器即把错误异常统一处理的方法&#xff0c;可以在多个地方使用&#xff0c;而不需要为每个地方编写单独的处理逻辑。它可以帮助开发人员更好地管理异常&#xff0c;并提供一致的错误处理方式。 1.2 优点 1.全局异常处理可以提高代码…...

Day05-循环高级和数组

循环高级 1.无限循环 概念&#xff1a; 又叫死循环。循环一直停不下来。 for格式&#xff1a; for(;;){System.out.println("循环执行一直在打印内容"); } 解释&#xff1a; 初始化语句可以空着不写&#xff0c;表示循环之前不定义任何的控制变量。 条件判断…...

从代码操作层面解释什么是“面相对象编程”?

起因&#xff1a; 今天开了一个小会&#xff0c;会上朋友给我们说了一个事&#xff0c;Java项目上他开发一个小功能 用了很多代码&#xff0c;项目经理发现代码太多&#xff0c;说要优化一下&#xff0c;然后亲自帮同事优化&#xff0c;结果是查库的代码少了至少10条sql&#x…...

【MySQL】SQL优化、char、varchar、外键约束、排查慢sql等重点知识汇总

目录 SQL语句 char和varchar比较 SQL语句如何优化 说一下你理解的外键约束 如何排查慢 sql SQL语句 对库操作 创建数据库 create database 数据库名 删除数据库 drop database 数据库名 显示所有数据库 show databases 选中数据库 use 数据库名 对表操作 创建表…...

git管理常用命令

1、下载代码 git clone 地址2、软件代码提交 1、查看工程中被修改的文件&#xff1a;git status 2.将不需要提交的文件回退&#xff1a;git check <文件路径> 3.更新工程到最新&#xff1a;git pull 4.将本地代码添加到暂存区&#xff1a;git add <将要提交的文件路…...

Python 逢七拍手小游戏2.0

"""逢七拍手游戏介绍&#xff1a;逢七拍手游戏的规则是&#xff1a;从1开始顺序数数&#xff0c;数到有7&#xff0c;或者是7的倍数时&#xff0c;就拍一手。例如&#xff1a;7、14、17......70......知识点&#xff1a;1、循环语句for2、嵌套条件语句if/elif/e…...

基于微信小程序的在线小说阅读系统,附数据库、教程

1 功能简介 Java基于微信小程序的在线小说阅读系统 微信小程序的在线小说阅读系统&#xff0c;系统的整体功能需求分为两部分&#xff0c;第一部分主要是后台的功能&#xff0c;后台功能主要有小说信息管理、注册用户管理、系统系统等功能。微信小程序主要分为首页、分类和我的…...

216. 组合总和 III

找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 解释: …...

【Java】数组的深浅拷贝问题(二维数组举例)(136)

深拷贝和浅拷贝&#xff1a; 对于数组来说&#xff0c;深拷贝就是相当于拷贝了数组的对象&#xff08;基本数据类型&#xff09;&#xff0c;也就是数组当中的内容。而浅拷贝就是拷贝的是数组的地址&#xff08;引用类型&#xff09;&#xff0c;浅拷贝只是复制了对象的引用地…...

【轮趣-科大讯飞】M260C 环形六麦测试 2 - ROS1功能测试与唤醒、语音识别程序解析

所有内容请看&#xff1a; 博客学习目录_Howe_xixi的博客-CSDN博客https://blog.csdn.net/weixin_44362628/article/details/126020573?spm1001.2014.3001.5502原文在飞书&#xff0c;请联系我获取阅读链接&#xff0c;我太懒了...

油猴(篡改猴)学习记录

第一个Hello World 注意点:默认只匹配了http网站,如果需要https网站,需要自己添加match https://*/*代码如下 这样子访问任意网站就可以输出Hello World // UserScript // name 第一个脚本 // namespace http://tampermonkey.net/ // version 0.1 // descri…...

LeetCode 面试题 05.08. 绘制直线

文章目录 一、题目二、Java 题解 一、题目 已知一个由像素点组成的单色屏幕&#xff0c;每行均有 w 个像素点&#xff0c;所有像素点初始为 0&#xff0c;左上角位置为 (0,0)。 现将每行的像素点按照「每 32 个像素点」为一组存放在一个 int 中&#xff0c;再依次存入长度为 le…...

机器人中的数值优化|【六】线性共轭梯度法,牛顿共轭梯度法

机器人中的数值优化|【六】线性共轭梯度法&#xff0c;牛顿共轭梯度法 往期回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化…...

FastestDet---原理介绍

1.测试指标 2.算法定位 FastestDet是设计用来接替yolo-fastest系列算法,相比于业界已有的轻量级目标检测算法如yolov5n, yolox-nano, nanoDet, pp-yolo-tiny, FastestDet和这些算法根本不是一个量级,FastestDet无论在速度还是参数量上,都是要小好几个数量级的,但是精度自然…...

ORACLE 在内存管理机制上的演变和进化

截止目前&#xff0c;计算机内存仍然被认为是我们可以获得的最快速度的物理存储设备。 将频繁访问的数据尽可能地置于内存中&#xff0c;已成为当前各种软件和应用程序提高数据访问性能&#xff0c;减少访问延迟的最为有效的途径。 然而&#xff0c;内存作为关键的计算资源&am…...

Linux ❀ 进程出现process information unavailable时的消除方法

[rootmaster ~]# jps 74963 -- process information unavailable 78678 Jps [rootmaster ~]# cd /tmp/hsperfdata_redhat/ # redhat为启动该java进程的用户ps -ef | grep $pid查找 [rootmaster hsperfdata_redhat]# ll total 32 -rw------- 1 redhat redhat 32768 Sep 27 15:…...

ps智能填充功能平替:alpaca的安装和使用

为了解决ps beta 智能填充无法使用的问题&#xff0c;需要用alpaca来平替&#xff0c;下面是安装教程&#xff1a; 安装方法&#xff1a; 1、下载插件。 alpaca插件汉化-夸克网盘https://pan.quark.cn/s/1168b447a44e#/list/share 2、 根据使用的PS版本&#xff0c;选择对应文件…...

企业网站怎样做外链方法/google推广

题目描述&#xff1a; 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例: 给定 nums …...

工邦邦官网/杭州seo俱乐部

IE的脚本错误对话框非常不友好,无法copy详细信息 (至少IE7是这样)。发现Firefox的Tools > Error Console 中也可以看到错误信息而且可以Copy! 调试程序时&#xff0c;在VS中将默认浏览器设置为Firefox就可以调试并可以Copy脚本错误信息了...

海城网站制作建设/哈尔滨最新消息

一、Amoeba的简述&#xff1a;[来自百度百科] Amoeba是一个以MySQL为底层数据存储&#xff0c;并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求&#xff0c;依据用户事先设置的规则&#xff0c;将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离…...

枣庄手机网站建设报价/爱站网关键词查询系统

百度地图api2.4.1 在发起步行路径检索的时候 onGetWalkingRouteResult回调方法中的结果总是空的&#xff0c;即使直接复制api的代码也不对。坐标我是用的百度地图的拾取坐标系统获取的坐标。开始的代码double cLat112.556305;double cLon32.975724;double cLat2112.560727;doub…...

北京新一轮病毒/网站优化人员通常会将目标关键词放在网站首页中的

SQL Server 中master..spt_values的应用 今天在做数据分析报表的时候遇到一个这样的问题。 表结构如下。 部门编码、部门名称、部门人员ID&#xff08;中间用逗号分割&#xff09; 我想通过和人员表链接&#xff0c;查询出一个新的数据集&#xff0c;查询出的结果集格式如下&…...

百度登录/长沙网站优化方案

更多代码请见&#xff1a;https://github.com/xubo245/SparkLearning Spark中组件Mllib的学习之分类篇 1解释 MLlib决策树支持三种不纯度的计算&#xff1a;gini、entropy、variance。其他的目前不支持 def fromString(name: String): Impurity name match {case "gin…...