浅谈linux - mutex锁应用

2023-05-16

概述

互斥锁是专门用于处理线程之间互斥关系的一种方式,它有两种状态:上锁状态、解锁状态。


如果互斥锁处于上锁状态,那么再上锁就会阻塞到这把锁解开为止,才能上锁。


解锁状态下依然可以解锁,不会阻塞。

注意

另外,小编所有文章均是自己亲手编写验证,由于文件太多,小编就不在公众号后台一一回复列举了,若需要小编的工程代码,请关注公众号:不只会拍照的程序猿,后台回复需要的工程文件小编看到后会第一时间回复。

接口

初始化锁

静态初始化

/**
 * @ 静态初始化一个mutex锁
 */
pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;

动态初始化

/**
 * @ 动态初始化一个mutex锁
 * @ mutex: 指定要初始化的mutex锁的地址        mutexattr: NULL 默认值
 * @ 总是成功返回0
 */
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

销毁锁

/**
 * @ 销毁mutex锁,释放锁hold的资源
 * @ mutex: 指定要销毁的锁的地址
 * @ 成功返回0,失败返回非0的错误码
 */
int pthread_mutex_destroy(pthread_mutex_t *mutex);

加锁

/**
 * @ 加锁 如果锁被其他线程占用,阻塞等待其他线程解锁,如果锁处于解锁状态,加锁,立即返回
 * @ mutex: 指定要加锁的锁的地址
 * @ 成功返回0,失败返回非0的错误码
 */
int pthread_mutex_lock(pthread_mutex_t *mutex);

尝试加锁

/**
 * @ 尝试加锁 如果锁处于解锁状态,加锁,立即返回,如果锁被其他线程占用,立即返回错误EBUSY
 * @ mutex: 指定要加锁的锁地址
 * @ 成功返回0,失败返回非0的错误码
 */
int pthread_mutex_trylock(pthread_mutex_t *mutex);

解锁

/**
 * @ 解锁
 * @ mutex: 指定锁的地址
 * @ 成功返回0,失败返回非0的错误码
 */
int pthread_mutex_unlock(pthread_mutex_t *mutex);

示例

★示例通过mutex_test.c向用户展示线程的基本使用。

★包含演示程序mutex_test.c(已验证通过)。

2979d0beb4e4529a16e3346f019ad05d.png mutex_test.c

/**
 * @Filename : mutex_test.c
 * @Revision : $Revision: 1.00 $
 * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
 * @Description : 互斥锁的基本应用示例
**/

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

 /* 全局变量,临界资源。用作线程共享资源 */
int value = 0;    

/* 静态初始化锁 */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

/**
 * @ 线程执行函数
 * @ args: 传递来的参数
 */ 
static void *thread(void *args)
{
     int j, tmp;    /* 局部变量,在函数的栈帧里 */

    for (j=0; j<5; j++) {
        pthread_mutex_lock(&mutex);        /* 加锁 */
        tmp = value;
        tmp++;
        printf("%s:tid[%lu] tmp=%d\t\n", (char *)args, (int)pthread_self(), tmp);
        value = tmp;
        pthread_mutex_unlock(&mutex);    /* 释放锁 */
        sleep(1);
    }
    return NULL;
}

/**
 * @ 主函数,程序入口
 */
int main(void)
{
    void *ret;
    pthread_t tid1, tid2;       /* 线程ID */

    /* 创建线程 */
    if (pthread_create(&tid1, NULL, thread, "thread1") != 0) {
        printf("pthread1 create failed...\n");
        return -1;
    }

    if (pthread_create(&tid2, NULL, thread, "thread2") != 0) {
        printf("pthread2 create failed...\n");
        return -1;
    }

    /* 阻塞等待线程的汇合,接收线程的退出状态码 */
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    /* 销毁mutex锁 */
    pthread_mutex_destroy(&mutex);

    return 0;
}

验证

编译程序,记得加库-pthread

#编译代码,记得-pthread
ubuntu@U:~/study/mutex$ gcc mutex_test.c -pthread
ubuntu@U:~/study/mutex$

执行程序

#执行代码
ubuntu@U:~/study/mutex$ ./a.out 
thread2:tid[2423281408] tmp=1    
thread1:tid[2431674112] tmp=2    
thread2:tid[2423281408] tmp=3    
thread1:tid[2431674112] tmp=4    
thread1:tid[2431674112] tmp=5    
thread2:tid[2423281408] tmp=6    
thread2:tid[2423281408] tmp=7    
thread1:tid[2431674112] tmp=8    
thread1:tid[2431674112] tmp=9    
thread2:tid[2423281408] tmp=10    
ubuntu@U:~/study/mutex$

往期 · 推荐

实时系统vxWorks - 任务(重要)

实时系统vxWorks - 加载应用程序的方法

实时系统vxWorks - 在线调试

实时系统vxWorks - 虚拟机环境搭建

实时系统vxWorks - zynq7020移植vxWorks

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈linux - mutex锁应用 的相关文章

随机推荐

  • 浅谈linux - virtual box设置共享文件夹

    概述 本文用于展示在virtual box虚拟机创建共享文件夹 xff0c 实现windows和ubuntu文件互传 注意 开发环境 xff1a VirtualBox 6 1 ubuntu 16 04 另外 xff0c 小编所有文章均是自己
  • 浅谈linux - 搭建nfs服务

    概述 本文用于展示如何搭建nfs服务 xff0c 实现开发机和目标机之间的文件共享 注意 开发环境 xff1a ubuntu 16 04 xff0c linux 4 9 xff0c 开发板 xff1a TLZ7x EasyEVM A3 另外
  • 听说Zynq-petalinux编译linux程序

    概述 PetaLinux 是一种嵌入式 Linux 软件开发套件 SDK 主要用于赛灵思 FPGA 基片上系统设计 注意 开发环境 linux4 9 VirtualBox 6 1 ubuntu 16 04 开发板 TLZ7x EasyEVM
  • 实时系统vxWorks - udp组播通讯

    概述 组播又称多目标广播 多播 网络中使用的一种传输方式 它允许把所发消息传送给所有可能目的地中的一个经过选择的子集 即向明确指出的多种地址输送信息 是一种在一个发送者和多个接收者之间进行通信的方法 注意 开发环境 vxWorks6 9 4
  • 实时系统vxWorks - tcp客户端通讯

    概述 传输控制协议 TCP Transmission Control Protocol 是一种面向连接的 可靠的 基于字节流的传输层通信协议 注意 开发环境 vxWorks6 9 4 workbench3 3 5 另外 小编所有文章均是自己
  • nvm导致React Native启动失败

    错误如下 xff1a The following build commands failed PhaseScriptExecution CP User Generate Specs Users qiaohao Library Develop
  • 实时系统vxWorks - tcp服务器通讯

    概述 接上一篇文章 本文主要展示vxWorks下TCP服务器的编程方法 注意 开发环境 vxWorks6 9 4 workbench3 3 5 另外 小编所有文章均是自己亲手编写验证 由于文件太多 小编就不在公众号后台一一回复列举了 若需要
  • 开发工具 - 离线安装VS code插件

    概述 VSCode具有丰富的插件库 xff0c 程序猿们可以根据自己需要安装插件 xff0c 大大提高VS code工具的生产力 注意 开发环境 xff1a Ubuntu 16 04 xff0c 开发板 xff1a TLZ7x EasyEV
  • 开发工具 - 设置vs code主题

    概述 不可否认 xff0c 良好的界面风格能给程序员带来更好的软件体验 对于小编这种颜值至上的人来说 xff0c 一个高颜值的软件会让人心情愉悦 xff0c 编写代码效率提高 这也是VS code和Source Insight软件的对比优势
  • 开发工具 - 设置vs code显示中文

    概述 本文主要针对像小编一样对于英文看着比较吃力的小伙伴 xff0c 如果你对自己英文很有信心 xff0c 那么建议忽略此文章 注意 开发环境 xff1a Ubuntu 16 04 xff0c 开发板 xff1a TLZ7x EasyEVM
  • 通信协议 - ntp时间同步

    概述 NTP Network Time Protocol xff09 网络时间协议基于UDP xff0c 用于网络时间同步的协议 xff0c 使网络中的计算机时钟同步到UTC xff0c 再配合各个时区的偏移调整就能实现精准同步对时功能 提
  • 通信协议 - ARINC615A加卸载协议

    概述 ARINC615A加卸载端系统由加载端软件和目标端软件组成 xff0c 通过加载端软件和目标端软件的通信共同完成端系统设备的数据加卸载功能 加载端软件运行于大容量设备中 xff0c 被加载端即目标端软件运行于AFDX交换机内和其他端系
  • 我用C语言玩对象,封装相似算法的策略模式

    概述 在策略模式 xff08 Strategy Pattern xff09 中 xff0c 一个类的行为或其算法可以在运行时更改 这种类型的设计模式属于行为型模式 在策略模式中 xff0c 我们创建表示各种策略的对象和一个行为随着策略对象改
  • 浅谈linux - 库文件制作与使用

    概述 本质上来说 xff0c 库文件就是可执行代码的二进制形式 xff0c 可以被操作系统载入内存中执行 Linux操作系统支持的函数库分为静态库和动态库 xff0c 动态库又称共享库 Linux系统有几个重要的目录存放相应的函数库 xff
  • 浅谈linux - vs code搭建运行调试环境

    概述 在Linux开发过程中 xff0c 用不惯vim的用户往往会选择vs code软件或者source insight软件编写相关的源代码 xff0c 由于vs code对linux系统的支持及界面的美观 xff0c 所以小编往往会选择使
  • 浅谈linux - samba实现linux与windows文件共享

    概述 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件 xff0c 而SMB是Server Message Block的缩写 xff0c 即为服务器消息块 xff0c SMB主要是作为Microsoft的网络通讯协
  • mysql的update、delete、和insert into时表别名用法

    mysql数据库update delete 和insert into表的时候 xff0c 如果要使用表别名 xff0c 必须按照规范写法来写 xff1a insert xff1a 简写 xff1a insert into t a a a i
  • 浅谈linux - RT Linux解决方案

    概述 RT Linux Real Time Linux 亦称作实时 Linux xff0c 是 Linux 中的一种硬实时操作系统 xff0c 它最早由美国墨西哥理工学院的 V Yodaiken 开发 产品资料提供的 Linux RT 内核
  • 浅谈linux - 线程的基本应用

    概述 线程 xff08 英语 xff1a thread xff09 是操作系统能够进行运算调度的最小单位 它被包含在进程之中 xff0c 是进程中的实际运作单位 注意 线程和进程之间的区别 1 线程是执行的基本单位 xff1b 进程是资源分
  • 浅谈linux - mutex锁应用

    概述 互斥锁是专门用于处理线程之间互斥关系的一种方式 xff0c 它有两种状态 xff1a 上锁状态 解锁状态 如果互斥锁处于上锁状态 xff0c 那么再上锁就会阻塞到这把锁解开为止 xff0c 才能上锁 解锁状态下依然可以解锁 xff0c