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

文章目录

    • 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等。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录一次“top负1”比赛经历

获奖啦&#xff01; 比赛题目&#xff1a;中文语义病句识别与纠正挑战赛 比赛链接&#xff1a;https://challenge.xfyun.cn/topic/info?typeidentification-and-correction&optionphb“请介绍你们团队” “各位评委老师&#xff0c;我是来自WOT团队的选手AMBT&#xff0…

知识储备--基础算法篇-动态规划

1.前言 第一次接触动态规划&#xff0c;不知道具体什么意思&#xff0c;做了题才发现动态规划就是把大问题变成小问题&#xff0c;并解决了小问题重复计算的方法称为动态规划。比如上楼梯&#xff0c;一次上一阶或二阶&#xff0c;求有多少种算法&#xff0c;就可以拆成最后一…

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页 文章目录 一、前言二、安装和基本使用1. 添加依赖2. 基础配置和初始化 三、实际业务中的用法1. 与 API 集成2. 错误处理 四、完整示例1. 创建一个无限滚动列表2. 使用在你的应用中3. 完整代码示例 五、总…

SFM structure from motion

struction就是空间三维点的位置 motion 就是相机每帧的位移 https://www.youtube.com/watch?vUhkb8Zq-dnM&listPL2zRqk16wsdoYzrWStffqBAoUY8XdvatV&index9

VBA Excel自定义函数的使用 简单的语法

一个简单的教程&#xff0c;实现VBA自定义函数。 新建模块 复制后面的代码放进来 函数的入口参数不定义&#xff0c;则认为是一块区域&#xff1b; 反之&#xff0c;如FindChar1 As String&#xff0c;则认为是输入的单值。 循环和分支如下例子&#xff0c;VB比较接近自然语…

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发&#xff1a;Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统&#xff0c;我还是写一下以便将来用到或参考&#xff5e; 了解 安装Ubuntu22.04&#xff08;截至2023年08月26日11&#xff…

Docker架构及原理

一、Docker的架构图 二、底层原理 Docker是怎么工作的&#xff1f; Docker是一个Client-Server结构的系统&#xff0c;Docker守护进程运行在主机上&#xff0c; 然后通过Socket连接从客户端访问&#xff0c;守护进程从客户端接受命令并管理运行在主机上的容器。 容器&#xf…

wireshark流量分析

一、题目一(1.pcap) 题目要求&#xff1a; 1.黑客攻击的第一个受害主机的网卡IP地址 2.黑客对URL的哪一个参数实施了SQL注入 3.第一个受害主机网站数据库的表前缀&#xff08;加上下划线例如abc&#xff09; 4.第一个受害主机网站数据库的名字 看到题目SQL注入&#xff0…

微服务(多级缓存)

目录 多级缓存 1.什么是多级缓存 2.JVM进程缓存 2.2.初识Caffeine 2.3.实现JVM进程缓存 2.3.1.需求 2.3.2.实现 3.Lua语法入门 3.1.初识Lua 3.1.HelloWorld 3.2.变量和循环 3.2.1.Lua的数据类型 3.2.2.声明变量 3.2.3.循环 3.3.条件控制、函数 3.3.1.函数 3.3.…

机器学习简介[01/2]:简单线性回归

Python 中的机器学习简介&#xff1a;简单线性回归 一、说明 简单线性回归为机器学习提供了优雅的介绍。它可用于标识自变量和因变量之间的关系。使用梯度下降&#xff0c;可以训练基本模型以拟合一组点以供未来预测。 二、技术背景 这是涵盖回归、梯度下降、分类和机器学习的其…

下载的文件被Windows 11 安全中心自动删除

今天从CSDN上下载了自己曾经上传的文件&#xff0c;但是浏览器下载完之后文件被Windows安全中心自动删除&#xff0c;说是带病毒。实际是没有病毒的&#xff0c;再说了即便有病毒也不应该直接删除啊&#xff0c;至少给用户一个保留或删除的选项。 研究了一番&#xff0c;可以暂…

springboot整合第三方技术邮件系统

springboot整合第三方技术邮件系统&#xff0c;发邮件是java程序的基本操作&#xff0c;springboot整合javamail其实就是简化开发。不熟悉邮件的小伙伴可以先学习完javamail的基础操作&#xff0c;再来看这一部分内容才能感触到springboot整合javamail究竟简化了哪些操作。简化…

vue ui 创建项目没有反应

问题 cmd中输入 vue ui 没有反应 解决办法 vue ui命令需要vue3.0以上的版本才可以 1、查看当前版本 vue --version vue版本在3.0以下是没有ui命令的 2、查看版本所拥有的命令 vue -h 3、卸载之前版本的vue npm uninstall vue-cli -g 卸载完成&#xff0c;检查是否已经…

elementui table 在浏览器分辨率变化的时候界面异常

异常点&#xff1a; 界面显示不完整&#xff0c;表格卡顿&#xff0c;界面已经刷新完成&#xff0c;但是表格的宽度还在一点一点变化&#xff0c;甚至有无线延伸的情况 思路&#xff1a; 1. 使用doLayout 这里官方文档有说明&#xff0c; 所以我的想法是&#xff0c;监听浏览…

HTML5-1-标签及属性

文章目录 语法规范标签规范标签列表通用属性基本布局 页面的组成&#xff1a; HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是用来描述网页的一种语言&#xff0c;它不是一种编程语言&#xff0c;而是一种标记语言。 HTML5 是下一代 HTM…

第四章:树形结构的关联式容器(map+set)

系列文章目录 文章目录 系列文章目录前言1、关联式容器与序列式容器1.1 键值对 2、set的介绍3、multiset的介绍3.1 接口count与容器multiset 4、map的介绍4.1 接口insert4.2 operator[]和at 5、multimap的介绍 前言 根据应用场景的不桶&#xff0c;STL总共实现了两种不同结构的…

Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

一、前言 不同于之前的term。terms等结构化查询&#xff0c;全文搜索首先对查询词进行分析&#xff0c;然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据&#xff08;text类型&#xff09;,默认的数据形式是人类的自然语言&#xff0c;如对话内容、图书名…

springboot+mp完成简单案例

目录 1.框架搭建 2.前端搭建 3.后端编写 需求&#xff1a;完成简单的连表条件查询以及添加即可 1.框架搭建 1.创建springboot项目 2.相关依赖 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

Leetcode每日一题:1448. 统计二叉树中好节点的数目(2023.8.25 C++)

目录 1448. 统计二叉树中好节点的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1448. 统计二叉树中好节点的数目 题目描述&#xff1a; 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 4 Data store标签页介绍

这篇文章我们继续讲解code-mapping的Data stores页,这个页的内容对应的SIMULINK中的模块是Data store memory。 我们首先在模型中创建一个Data store memory模块,如图: Data store memory模块的作用相当于一个全局变量,我们可以在模型的功能逻辑里将一个信号存进去,在另…