Linux互斥锁pthread_mutex_lock和pthread_mutex_unlock

当一个进程中存在两个及以上的线程时,线程间会互相争夺共享资源,导致单个线程中的执行秩序会被打乱。所以需要用到互斥锁来进行秩序控制,保证单个线程中的程序先执行完毕。

2、创建互斥锁pthread_mutex_init();

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

参数说明:
1. *mutex 互斥量的索引(名称),为指针变量;
2. *attr 互斥量的属性,通常为 NULL。
返回值: 成功返回0;失败返回错误编码。
我们在使用的时候,应该把 *mutex定义为全局变量,这样所有的线程都能使用。
2、销毁互斥锁pthread_mutex_destroy();

int pthread_mutex_destroy(pthread_mutex_t *mutex);

参数说明: *mutex 互斥锁的索引(名称),注意这里同样是指针变量。
返回值: 成功返回0;失败返回错误编码;
我们在所有线程都执行完毕后,应该销毁互斥锁。
3、上锁pthread_mutex_lock();

int pthread_mutex_lock(pthread_mutex_t *mutex);

参数说明: *mutex 互斥锁的索引(名称),注意这里同样是指针变量。
返回值: 成功返回0;失败返回错误编码。
4、解锁pthread_mutex_unlock();

int pthread_mutex_unlock(pthread_mutex_t *mutex);

参数说明: *mutex 互斥锁的索引(名称),注意这里同样是指针变量。
返回值: 成功返回0;失败返回错误编码。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>int shared_data = 0;
pthread_mutex_t mutex;void *threadFoo(void *arg)
{pthread_mutex_lock(&mutex);//加锁while(1){shared_data++;printf("threadFoo:shared_data=%d\n",shared_data);if(shared_data == 10){pthread_mutex_unlock(&mutex);//执行完之后解锁pthread_exit(NULL);}sleep(1);}
}
void *threadBar(void *arg)
{pthread_mutex_lock(&mutex);//加锁while(1){shared_data++;printf("___threadBar:shared_data=%d\n",shared_data);if(shared_data == 20){pthread_mutex_unlock(&mutex);//执行完之后解锁pthread_exit(NULL);}sleep(1);}
}int main()
{pthread_t threadID1;pthread_t threadID2;pthread_mutex_init(&mutex,NULL);pthread_create(&threadID1, NULL, (void *) threadFoo, NULL);pthread_create(&threadID2, NULL, (void *) threadBar, NULL);pthread_join(threadID1, NULL);pthread_join(threadID2, NULL);pthread_mutex_destroy(&mutex);return 0;
}

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

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

相关文章

k8s之共享存储pvpvc

目录 1.1 存储资源管理 1.2 持久卷pv的类型 1.3 实验mysql基于NFS共享存储实现持久化存储 1.3.1 安装NFS 1.3.2 PV参数详解 1.3.3 创建pv 1.3.4 mysql使用pvc持久卷 1.4 动态绑定pv 1.4.1 配置nfs-provisioner授权 1.4.2 部署nfs-client-provisioner 1.4.3 创建Stor…

35. 常用shell之 df - 磁盘空间使用情况 的用法及衍生用法

df&#xff08;disk free&#xff09;是一个在大多数类 Unix 系统上可用的命令行工具&#xff0c;用于显示文件系统的磁盘空间使用情况。 基本用法 显示所有文件系统的磁盘使用情况: df 这个命令会列出所有挂载的文件系统及其磁盘使用情况。 以人类可读的格式显示信息: df -…

CentOS7 安装 DockerCompose

目录 一、安装Docker 二、安装步骤 2.1 卸载 2.2 安装docker 2.3 启动docker 2.4 配置镜像加速器 一、安装Docker Docker 分为 CE 和 EE 两大版本。 CE 即社区版(免费&#xff0c;支持周期7个月)EE 即企业版强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月…

Altium Designer切换中文界面与英文界面的方法图文教程及视频演示

目录 视频演示1&#xff0c;概述2&#xff0c;汉化切换为中文界面3&#xff0c;切换为英文界面4&#xff0c;总结 视频演示 Altium Designer软件汉化方法 欢迎点击浏览更多高清视频演示 1&#xff0c;概述 Altium Designer支持汉化界面&#xff0c;本文演示Altium Designer软件…

中奖记录设计(策略+模板)

背景 最近需求要做一个活动需求,用户只要参与活动就可以获得奖励,奖励分为以下几种: 创角奖励: 用户在活动内的游戏创建角色即可中奖 等级奖励: 角色在游戏内级别达到某一个级别即可中奖 VIP级别奖励: 角色在游戏内VIP级别达到某一个级别即可中奖 排行榜奖励: 角色某一天充值榜…

Qt+Vs踩坑之QString转std::string中文乱码

文章目录 1.Qt内部的编码造成的中文乱码2.QString与std::string之间转换造成的中文乱码3.QString、string、char*之间的转换4.参考文献 Qt中字符串存在两种中文乱码的情况&#xff1a;1.Qt内部的编码造成的中文乱码&#xff1b;2.QString与std::string之间转换造成的中文乱码。…

nodejs连接mongodb报错SyntaxError: Unexpected token .

nodejs连接mongodb报错SyntaxError: Unexpected token 如下图 经过排查&#xff0c;原因是npm默认安装的mongodb插件是最新版6.3.0 &#xff0c;而mongodb数据库版本是4.0.0 &#xff0c;两者版本不同导致nodejs报错。 解决方法是npm卸载新版本的mongodb插件&#xff0c;再安…

【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 第一个Java程序1.1 main方法1.2 Java的程序结构 二. Java程序的运行三. JDK、JR…

【YOLOV8追踪篇】使用Ultralytics YOLO进行物体追踪

YOLOV8追踪 目录 一 使用已训练的检测模型进行追踪 二 其他 视频分析领域的物体追踪是一项关键的任务,既能够标识出帧内物体的位置和类别,还能在视频进行的过程中为每个检测到的物体保持一个唯一的ID(追踪)。 Ultralytics YOLOv8相关介绍:

Achronix提供由FPGA赋能的智能网卡(SmartNIC)解决方案来打破智能网络性能极限

作者&#xff1a;Achronix 随着人工智能/机器学习&#xff08;AI/ML&#xff09;和其他复杂的、以数据为中心的工作负载被广泛部署&#xff0c;市场对高性能计算的需求持续飙升&#xff0c;对高性能网络的需求也呈指数级增长。高性能计算曾经是超级计算机这样一个孤立的领域&a…

20 Vue3中使用v-for遍历普通数组

概述 使用v-for遍历普通数组在真实开发中还是比较常见的。 基本用法 我们创建src/components/Demo20.vue&#xff0c;代码如下&#xff1a; <script setup> const tags ["JavaScript", "Vue3", "前端"] </script> <template…

301_C++_字符串解析函数‘strcasestr‘

if ((pctmpA = strcasestr(const_cast<char *>(pcMsg), "MotionAlarm"))&& (pctmpA =

(1)(1.10) SiK Radio v1

文章目录 前言 1 概述 2 连接无线电台 3 参数说明 前言 本文介绍了如何将 3DR Radio v1 连接到飞行控制器。你还应阅读 SiK Radio v2&#xff0c;其中包含更详细的用户指南和功能列表。 1 概述 3DR 无线电设备是在自动驾驶仪和地面站之间建立遥测连接的最简单方法。 3DR…

uniapp怎么跳转页面

在 UniApp 中&#xff0c;你可以使用以下方法来跳转到其他页面&#xff1a; 使用<navigator>标签&#xff1a; <navigator url"/pages/example/example">点击跳转</navigator> 在上面的示例中&#xff0c;点击"点击跳转"会导航到/pag…

Redis高可用性方案:主从复制与哨兵机制详解

大家好&#xff0c;我是升仔 在高可用性数据服务的构建中&#xff0c;Redis扮演着重要的角色。Redis的主从复制和哨兵机制是实现高可用性的关键组件。本文将详细探讨这两种机制的使用场景、配置细节&#xff08;尤其是持久化配置&#xff09;&#xff0c;并讨论相应的异常处理…

常见加解密算法分析(含使用场景)

加密算法主要分为三类&#xff1a;对称加密算法、非对称加密算法和散列算法。下面将分别介绍这些类别中的常见算法及其特点和使用场景。 对称加密算法 1. AES (Advanced Encryption Standard) AES是一种广泛使用的对称加密标准&#xff0c;可以使用128、192和256位的密钥长度…

如何在Android Framework源码中增加jni方法

我们都知道&#xff0c;在Android Framework源码中&#xff0c;有很多这种类型的方法&#xff0c;方法前缀有"public static native",这种方法就是native方法&#xff0c;会调用到jni中去。 如&#xff1a;public static native long getNativeHeapSize(); 那如何在…

Golang实践录:gin绑定解析json的两种方法

本文介绍 Golang 的 gin 框架接收json数据并解析的2种方法。 起因及排查 某微服务工程&#xff0c;最近测试发现请求超时&#xff0c;由于特殊原因超时较短&#xff0c;如果请求处理耗时超过1秒则认为失败。排查发现&#xff0c;可能是gin接收解析json数据存在耗时&#xff0c…

大数据---34.HBase数据结构

一、HBase简介 HBase是一个开源的、分布式的、版本化的NoSQL数据库&#xff08;即非关系型数据库&#xff09;&#xff0c;依托Hadoop分布式文件系统HDFS提供分布式数据存储&#xff0c;利用MapReduce来处理海量数据&#xff0c;用Zookeeper作为其分布式协同服务&#xff0c;一…

逆波兰计算器的完整代码

前置知识&#xff1a; 将中缀表达式转为List方法&#xff1a; //将一个中缀表达式转成中缀表达式的List//即&#xff1a;(3042)*5-6 》[(, 30, , 42, ), *, 5, -, 6]public static List<String> toIndixExpressionList(String s) {//定义一个List&#xff0c;存放中缀表达…