3.9、互斥锁(互斥量)

news2025/6/19 6:58:30

3.9、互斥锁(互斥量)

  • 1.互斥锁(互斥量)的介绍
  • 2. 互斥量相关操作函数
  • 3.互斥量函数的使用介绍
    • ①pthread_mutex_init
    • ②pthread_mutex_destroy
    • ③pthread_mutex_lock
    • ④pthread_mutex_trylock
    • ⑤pthread_mutex_unlock
  • 3.利用互斥锁实现线程同步

1.互斥锁(互斥量)的介绍

  • 为避免线程更新共享变量时出现问题,可以使用互斥量(mutexmutual exclusion的缩写)来确保同时仅有一个线程可以访问某项共享资源。可以使用互斥量来保证对任意共享资源的原子访问。
  • 互斥量有两种状态:已锁定(locked)和未锁定(unlocked)。任何时候,至多只有一个线程可以锁定该互斥量。试图对已经锁定的某一互斥量再次加锁,将可能阻塞线程或者报错失败,具体取决于加锁时使用的方法。
  • 一旦线程锁定互斥量,随即成为该互斥量的所有者,只有所有者才能给互斥量解锁。一般情况下,对每一共享资源(可能由多个相关变量组成)会使用不同的互斥量,每一线程在访问同一资源时将采用如下协议:
    • 针对共享资源锁定互斥量
    • 访问共享资源
    • 对互斥量解锁
  • 如果多个线程试图执行这一块代码(一个临界区),事实上只有一个线程能够持有该互斥量(其他线程将遭到阻塞),即同时只有一个线程能够进入这段代码区域,如下图所示:在这里插入图片描述

2. 互斥量相关操作函数

  • 互斥量的类型 pthread_mutex_t
  • int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
  • int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • int pthread_mutex_lock(pthread_mutex_t *mutex);
  • int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • int pthread_mutex_unlock(pthread_mutex_t *mutex);

3.互斥量函数的使用介绍

①pthread_mutex_init

互斥量的类型 pthread_mutex_t
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
    - 初始化互斥量
    - 参数 :
        - mutex : 需要初始化的互斥量变量
        - attr : 互斥量相关的属性,NULL
    - restrict : C语言的修饰符,被修饰的指针,不能由另外的一个指针进行操作。
        pthread_mutex_t *restrict mutex = xxx;
        pthread_mutex_t * mutex1 = mutex;
    - 返回值:
        成功:返回0
        失败:返回非0
        以下函数一样

②pthread_mutex_destroy

int pthread_mutex_destroy(pthread_mutex_t *mutex);
    - 释放互斥量的资源

③pthread_mutex_lock

int pthread_mutex_lock(pthread_mutex_t *mutex);
    - 加锁,阻塞的,如果有一个线程加锁了,那么其他的线程只能阻塞等待

④pthread_mutex_trylock

int pthread_mutex_trylock(pthread_mutex_t *mutex);
    - 尝试加锁,如果加锁失败,不会阻塞,会直接返回。

⑤pthread_mutex_unlock

int pthread_mutex_unlock(pthread_mutex_t *mutex);
    - 解锁

3.利用互斥锁实现线程同步

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

// 设置票的数量
int tickets = 100;

// 创建我们的互斥锁变量
pthread_mutex_t mutex;

// 线程执行函数
void * sellticket(void * arg) {

    while (1) {

        // 加锁
        pthread_mutex_lock(&mutex);

        if (tickets <= 0) {
            // 解锁
            pthread_mutex_unlock(&mutex);
            break;
        }
        printf ("%ld 正在卖第 %d 张票\n", pthread_self(), tickets -- );

        // 解锁
        pthread_mutex_unlock(&mutex);
        usleep(1000);
    }

}

int main() {

    // 初始化mutex
    pthread_mutex_init(&mutex, NULL);

    // 创建线程
    pthread_t tid1, tid2, tid3;
    pthread_create(&tid1, NULL, sellticket, NULL);
    pthread_create(&tid2, NULL, sellticket, NULL);
    pthread_create(&tid3, NULL, sellticket, NULL);

    // 回收子线程
    // pthread_join(tid1, NULL);
    // pthread_join(tid2, NULL);
    // pthread_join(tid3, NULL);

    // 给线程加上分离参数
    pthread_detach(tid1);
    pthread_detach(tid2);
    pthread_detach(tid3);

    // 以上两个使用一个即可

    // 销毁释放一个锁
    pthread_mutex_destroy(&mutex);

    // 退出主线程
    pthread_exit(NULL);

    return 0;
}

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

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

相关文章

计讯物联双网口工业路由器TR321助力货轮冷链监测解决方案高质量落地

政策背景 国务院办公厅印发我国冷链物联流域第一份五年规划——《“十四五”冷链物流发展规划》&#xff08;以下简称“规划”&#xff09;。《规划》聚焦冷链物流体系、冷链运输、冷链物流服务、冷链物流创新及冷链物流监管体系等方面&#xff0c;对冷链物流的全流程、全环节…

Ficow 的 AI 平台快速上手指南(ChatGPT, NewBing, ChatGLM-6B, cursor.so)

本文首发于 Ficow Shen’s Blog&#xff0c;原文地址&#xff1a; Ficow 的 AI 平台快速上手指南(ChatGPT, NewBing, ChatGLM-6B, cursor.so)。 内容概览 前言OpenAI —— ChatGPT微软 —— NewBing智谱AI —— ChatGLM-6BAI生成代码 —— cursor.so总结 前言 现在各种AI工具大…

虚拟机网络配置

点击【编辑虚拟机设置】&#xff0c;点击【网络适配器】&#xff0c;选择【桥接模式】 选择好之后退回主页&#xff0c;点击【编辑】&#xff0c;选择【虚拟网络编辑器】 添加一个【VMnet8】的网络名称 点击【开启虚拟机】 输入账户密码&#xff0c;输入【cd /etc/sysconfig/ne…

springcloud——gateway功能拓展

目录 1.获取用户真实IP 2.统一跨域配置 3.redis令牌桶算法限流 1.获取用户真实IP 在我们的日常业务中&#xff0c;我们时常需要获取用户的IP地址&#xff0c;作登录日志、访问限制等相关操作。 而在我们的开发架构中&#xff0c;一般我们将服务分为多个微服务&#xff0c;…

熟练了Flex布局之后,该学学Grid布局了

介绍 CSS Gird布局也叫二维网格布局系统&#xff0c;可用于布局页面主要的区域布局或小型组件。网格是一组相交的水平线和垂直线&#xff0c;它定义了网格的列和行。我们可以指定将网格元素放置在与这些行和列相关的位置上。 一维布局 和 二维布局 像流布局和Flex布局&#…

Windows10系统安装perl命令

文章目录1&#xff0c;下载ActivePerl 5.28&#xff08;基于Windows 10系统&#xff09;&#xff1a;1.1&#xff0c;Perl 主页: https://www.perl.org/get.html1.2&#xff0c;选择windows1.3&#xff0c;选择Binaries---activeperla版本1.3&#xff0c;直接选择windows 5.36版…

【观察】神州数码高质量发展背后,是技术创新“叠加效应”的释放

毫无疑问&#xff0c;在百年变局和世纪疫情的双重影响下&#xff0c;整个2022年科技行业的增速都在放缓&#xff0c;更对身处其中的科技企业的业务连续性和成长性提出了更高的考验。尽管如此&#xff0c;神州数码&#xff08;000034.SZ&#xff09;仍然交出了一份令市场亮眼的成…

【iOS逆向与安全】使用ollvm混淆你的源码

前言 当你在研究别人源码的时候&#xff0c;是不是期望着别人代码没有进行任何的防护和混淆。这时的你&#xff0c;是不是应该考虑一下自己代码的安全.本篇文章将告诉你&#xff0c;如何使用ollvm来混淆iOS端的代码【此文为入门贴&#xff0c;大佬请绕道】。 一、目标 编译o…

【MybatisPlus快速入门】—— 拓展入门

逻辑删除 前面我们完成了基本的增删改查操作&#xff0c;但是对于删除操作来说&#xff0c;我们思考一个问题&#xff0c;在实际开发中我们真的会将数据完成从数据库中删除掉么&#xff1f;很多情况下我们是需要保留要删除的数据用来总结统计的&#xff0c;所以我们是不能将数…

从零学习SDK(5)SDK文档的学习和参考

要想充分利用SDK的优势&#xff0c;仅仅下载和安装SDK是不够的&#xff0c;还需要学习和参考SDK提供的文档和资源。文档和资源是SDK的重要组成部分&#xff0c;它们可以帮助开发者掌握SDK的基本概念、结构、用法、限制和最佳实践&#xff0c;以及解决常见的问题和错误。 查找…

(数字图像处理MATLAB+Python)第三章图像基本运算-第二节:图像代数运算

文章目录一&#xff1a;图像算数运算&#xff08;1&#xff09;加法运算A&#xff1a;概述B&#xff1a;程序&#xff08;2&#xff09;减法运算A&#xff1a;概述B&#xff1a;程序&#xff08;3&#xff09;乘法运算A&#xff1a;概述B&#xff1a;程序&#xff08;4&#xf…

C++模板基础(九)

完美转发与 lambda 表达式模板 void f(int& input) {std::cout << "void f(int& input)\t" << input << \n; }void f(int&& input) {std::cout << "void f(int&& input)\t" << input << \n;…

MYSQL8窗口函数

MYSQL8窗口函数MYSQL8窗口函数窗口函数分类序号函数--排行榜row_number()示例rank()示例dense_rank()示例partition by对每个分区内的行进行排名不加partition by全局排序开窗聚合函数分布函数CUME_DIST()PERCENT_RANK()前后函数LAG()的用法LEAD()头尾函数其他函数NTH_VALUE()N…

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发

文章目录发送验证码登录退出登录界面控件获取用户信息功能项目地址前端代码的框架采用vue.js elementUI 这套较为简单的方式实现&#xff0c;以及typescript语法更方便阅读。首先添加全局对象&#xff1a; loginForm: 登录表单对象 twoFactorData: 两步验证数据&#xff0c; …

跨平台应用开发进阶(五十九):uni-app实现视屏播放小窗功能

文章目录一、前言二、解决方案三、拓展阅读一、前言 在业务功能开发过程中&#xff0c;需要实现视频直播、播放小窗功能。鉴于目前通过接入火山webSDK实现视频直播、点播功能。需要火山协助配合改造实现小窗功能。 uni-app插件市场也提供了若干插件&#xff0c;经试用效果并不…

从二叉树的角度看快速排序

快速排序本质上可以看作二叉树的前序遍历 快速排序是先将一个元素排好序&#xff0c;然后再将剩下的元素排好序 核心思路依然是分治 快排整体思路 准确的可以说是治分 > 先治 得到分界点后 再分 治&#xff1a;双指针技巧&#xff08;左右指针或者快慢指针&#xff0c;…

【Docker】11、IDEA集成Docker插件实现一键部署SpringBoot项目

日常开发项目的过程中&#xff0c;我们每次需要部署线上的时候&#xff0c;都需要安装一大堆的运行环境&#xff0c;例如&#xff1a;JDK、MySQL、Redis 等&#xff0c;非常花费时间、我们可以使用 Docker 的容器技术&#xff0c;方便快捷地搭建项目启动所需要的运行环境&#…

【微服务笔记15】微服务组件之Config配置中心实现用户认证、配置属性加解密

这篇文章&#xff0c;主要介绍微服务组件之Config配置中心实现用户认证、配置属性加解密。 目录 一、用户认证 1.1、引入security依赖 1.2、服务端ConfigServer添加访问配置 1.3、客户端ConfigClient添加访问配置 二、配置属性加解密 2.1、对称加密 &#xff08;1&#…

逍遥自在学C语言 | 位运算符^的高级用法

前言 在上一篇文章中&#xff0c;我们介绍了|运算符的高级用法&#xff0c;本篇文章&#xff0c;我们将介绍^ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— …

windows系统管理_文件系统授权规则

NTFS 权限规则 NFTS 权限有一些隐含规则&#xff0c;用户最终有效权限受这些规则的影响&#xff0c;了解并运用这些规则&#xff0c;才能 灵活的分配权限&#xff0c;符合实际需求。 1 权限的累加 如果在某个文件或文件夹的访问控制列表中为某个用户分配了操作权限&#xff…