【Linux操作系统】Linux系统编程中的互斥锁

news2024/9/28 5:23:51

文章目录

    • 1. 互斥锁的原理
    • 2. 互斥锁的相关函数
    • 3. 互斥锁的例子
    • 总结

1. 互斥锁的原理

在Linux系统编程中,互斥锁(Mutex)是一种用于保护共享资源的同步机制。它可以确保在任意时刻只有一个线程可以访问被保护的资源,从而避免了多个线程同时对资源进行修改而导致的数据竞争和不一致性。

互斥锁的原理是通过一个锁变量来实现的,该变量可以处于两种状态:锁定(locked)和未锁定(unlocked)。当一个线程想要访问被保护的资源时,它需要先尝试获取锁,如果锁处于未锁定状态,则该线程可以获取锁,并将锁状态设置为锁定;如果锁处于锁定状态,则该线程需要等待,直到锁被释放为止。

2. 互斥锁的相关函数

我们可以使用pthread库提供的函数来实现互斥锁的操作。以下是一些常用的互斥锁函数:

  • pthread_mutex_init: 用于初始化互斥锁变量。
  • pthread_mutex_destroy: 用于销毁互斥锁变量。
  • pthread_mutex_lock: 用于获取互斥锁。
  • pthread_mutex_unlock: 用于释放互斥锁。
  1. pthread_mutex_init函数的作用是初始化互斥锁变量。

    • 原型:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
    • 参数:
      • mutex:指向要初始化的互斥锁变量的指针。
      • attr:指向互斥锁属性的指针,通常设置为NULL
    • 返回值:成功时返回0,失败时返回错误码。
  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,失败时返回错误码。

3. 互斥锁的例子

下面我们通过一个例子来说明互斥锁的使用方法。假设我们有一个全局变量count,多个线程需要同时对它进行累加操作。如果不使用互斥锁,可能会导致多个线程同时读取和修改count,从而导致结果不正确。

#include <stdio.h>
#include <pthread.h>

int count = 0;
pthread_mutex_t mutex;

void* thread_func(void* arg) {
    // 获取互斥锁
    pthread_mutex_lock(&mutex);

    // 对count进行累加操作
    for (int i = 0; i < 10000; i++) {
        count++;
    }

    // 释放互斥锁
    pthread_mutex_unlock(&mutex);

    pthread_exit(NULL);
}

int main() {
    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    pthread_t threads[10];

    // 创建10个线程
    for (int i = 0; i < 10; i++) {
        pthread_create(&threads[i], NULL, thread_func, NULL);
    }

    // 等待所有线程结束
    for (int i = 0; i < 10; i++) {
        pthread_join(threads[i], NULL);
    }

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    printf("count = %d\n", count);

    return 0;
}

在上面的代码中,我们首先使用pthread_mutex_init函数初始化了互斥锁变量mutex,然后创建了10个线程,并将它们的执行函数设置为thread_func。在thread_func函数中,首先通过pthread_mutex_lock函数获取互斥锁,然后对全局变量count进行累加操作,最后通过pthread_mutex_unlock函数释放互斥锁。在main函数中,我们使用pthread_join函数等待所有线程结束,然后使用pthread_mutex_destroy函数销毁互斥锁变量。

运行上述代码,我们可以得到正确的结果。由于互斥锁的存在,每个线程在对count进行累加操作时都会先获取互斥锁,从而保证了操作的原子性和一致性。

总结

通过本文,我们了解了Linux系统编程中互斥锁的原理和相关函数。互斥锁是一种用于保护共享资源的同步机制,可以避免多个线程同时对资源进行修改而导致的数据竞争和不一致性。我们可以使用pthread库提供的函数来实现互斥锁的操作,如pthread_mutex_initpthread_mutex_lockpthread_mutex_unlock等。

在这里插入图片描述

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

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

相关文章

软件工程(十四) 设计模式之结构型模式(二)

1、组合模式 简要说明 将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 速记关键字 树形目录结构 类图如下 由类图其实可以看出,组合模式就是将具有父子关系的结构,组装形成一棵树,并且根据规范,树干节点和叶子节…

大数据Flink(六十八):SQL Table 的基本概念及常用 API

文章目录 SQL & Table 的基本概念及常用 API 一、​​​​​​​一个 Table API\SQL任务的代码结构

tomcat高可用和nginx高可用

tomcat高可用和nginx高可用 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.什么是高可用&#xff1f; 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务…

大数据(三)大数据相关的职位

大数据&#xff08;三&#xff09;大数据相关的职位 本文目录&#xff1a; 一、写在前面的题外话 二、2022年就业状况 2.1、不同企业性质高校毕业生 CIER 指数 2.2、不同企业规模高校毕业生 CIER 指数 2.3、高校毕业生供求 TOP15 城市 2.4、一季度景气指数较高和较低的行…

CodeLlama本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【四】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【四】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章…

Shell脚本的超详细讲解

目录 一、Shell脚本简介1.1 什么是shell?1.2 什么是shell脚本1.3 shell脚本的意义 二、Shell解析器三、Shell脚本入门四、Shell中的变量4.1 系统变量4.2 自定义变量4.3 特殊变量&#xff1a;$n4.4 特殊变量&#xff1a;$#4.5 特殊变量&#xff1a; $*、$4.6 特殊变量&#xff…

本地部署 CodeLlama 并在 VSCode 中使用 CodeLlama

本地部署 CodeLlama 并在 VSCode 中使用 CodeLlama 1. CodeLlama 是什么2. CodeLlama Github 地址3. 下载 CodeLlama 模型4. 部署 CodeLlama5. 在 VSCode 中使用 CodeLlama 1. CodeLlama 是什么 Code Llama 是一个基于 Llama 2 的大型代码语言模型系列&#xff0c;在开放模型、…

《深入理解Java虚拟机》读书笔记:基于栈的字节码解释执行引擎

虚拟机是如何调用方法的内容已经讲解完毕&#xff0c;从本节开始&#xff0c;我们来探讨虚拟机是如何执行方法中的字节码指令的。上文中提到过&#xff0c;许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行&#xff08;通过解释器执行&#xff09;和编译执行&#xf…

UML建模以及几种类图的理解

文章目录 前言1.用例与用例图1.1 参与者1.2 用例之间的关系1.3 用例图1.4 用例的描述 2.交互图2.1 顺序图2.2 协作图 3.类图和对象图3.1 关联关系3.2 聚合和组合3.3 泛化关系3.4 依赖关系 4.状态图与活动图4.1 状态图4.2 活动图 5.构件图 前言 UML通过图形化的表示机制从多个侧…

【Unity3D赛车游戏】【五】Unity中汽车加速效果是如何优化的?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

基于JSP+Servlet+Mysql员工信息管理系统

基于JSPServletMysql员工信息管理系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的员工/客户/人员信息管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言…

暴力递归练习(三)— 逆序栈

题目 给你一个栈&#xff0c;如何在不申请额外的数据结构下&#xff0c;只能使用递归函数&#xff0c;将栈逆序&#xff1f; 思路 根据栈的特性&#xff0c;先进后出、后进先出&#xff0c;那我是不是获取到栈底的元素后&#xff0c;再进行压栈操作&#xff0c;栈就可以逆序。…

基于STM32设计的智能台灯

一、项目背景 智能家居设备在现代生活中起着越来越重要的作用。智能台灯作为其中的一种&#xff0c;具有调节光照亮度、色温等功能&#xff0c;更加符合人们对于光照环境的个性化需求。当前设计一款基于STM32微控制器设计的智能台灯&#xff0c;该台灯具备可调节亮度和色温的特…

Hugo·Stack主题·使用及修改

代码折叠 cp themes/hugo折-themt-saick/exampleSlte/config.yamsclass"codefold"><summary class"codefold__title"><span class"codefold__title-text">" {{ with .Get 0}}{{.}}{{else}}click to expand{{ end }} "&…

【C语言】指针详解(2)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解指针(2)&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 文章目录 一. 字符指针二 . 指针数组2.1 模拟一个二维数组2.2 维护多个字符串 三 . 数组指针3.1 解…

软件工程(八) UML之类图与对象图

1、类图与对象图 1.1、类图与对象图的概念 类图(class diagram)描述一组类、接口、协作和它们之间的关系 对象图(object diagram)描述一组对象及它们之间的关系、对象图描述了在类图中所建立的事物实例的静态快照。 1.2、类图与对象图的区别 类图和对象图基本上是一样…

【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

[MyBatis系列⑤]多表查询 | 一篇万字长文带你上手三种多表查询方式及其对象封装过程

目录 1、简介 2、业务场景及环境准备 2.1、环境 2.2、ER图 2.3、SQL 3、一对一 3.1、POJO 3.2、OrderMapper.xml 3.3、resultMap 3.4、执行结果 4、一对多 4.1、POJO 4.2、UserMapper.xml 4.3、resultMap 4.4、执行结果 5、多对多 5.1、POJO 5.2、UserMapper.…

2048小游戏成品源码

2048小游戏&#xff0c;可以自选背景颜色&#xff0c;方框颜色&#xff0c;音乐播放。 还可以展示当前玩家的排名&#xff0c;动态排名&#xff0c;及历史玩家的排名。 前期需求&#xff1a; 使用pygame加载目录音乐。MP3文件&#xff1a; def music_play():import pygame …