0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详谈Linux操作系统编程的互斥量mutex

如意 来源:良许Linux 作者:良许 2020-09-28 15:09 次阅读

##互斥量mutex

前文提到,系统中如果存在资源共享,线程间存在竞争,并且没有合理的同步机制的话,会出现数据混乱的现象。为了实现同步机制,Linux中提供了多种方式,其中一种方式为互斥锁mutex(也称之为互斥量)。

互斥量的具体实现方式为:每个线程在对共享资源操作前都尝试先加锁,成功加锁后才可以对共享资源进行读写操作,操作结束后解锁。

互斥量不是为了消除竞争,实际上,资源还是共享的,线程间也还是竞争的,只不过通过这种“锁”机制就将共享资源的访问变成互斥操作,也就是说一个线程操作这个资源时,其它线程无法操作它,从而消除与时间有关的错误。

从互斥量的实现机制我们可以看出,同一时刻,只能有一个线程持有该锁。如果有同时有多个线程持有该锁,那就没有实际意义了。

但是,这种锁机制不是强制的,互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。

因此,即使有了mutex,其它线程如果不按照这种锁机制来访问共享数据的话,依然会造成数据混乱。所以为了避免这种情况,所有访问该共享资源的线程必须采用相同的锁机制。

主要应用函数:

pthread_mutex_init函数

pthread_mutex_destroy函数

pthread_mutex_lock函数

pthread_mutex_trylock函数

pthread_mutex_unlock函数

以上5个函数的返回值都是:成功返回0,失败返回错误号。

在Linux环境下,类型pthread_mutex_t其本质是一个结构体。但是为了简化理解,应用时可忽略其实现细节,简单当成整数看待。mutex一般以下面方式定义:

pthread_mutex_t mutex;

变量mutex只有两种取值1、0。

##pthread_mutex_init函数

函数原型:

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

函数作用:初始化一个互斥锁(互斥量)mutex,初值可视为1;

参数介绍:

mutex:传出参数,调用时应传 &mutex给该函数;

这里有个关键字比较特殊:restrict。它的作用只用于限制指针,告诉编译器,所有修改该指针指向内存中内容的操作,只能通过本指针完成。不能通过除本指针以外的其他变量或指针修改。比如说,再定义个pthread_mutex_t的指针,将其赋值为mutex的值,想要用它来修改mutex所指向的内存,这是不允许的。

attr:互斥量属性。是一个传入参数,通常传NULL,表示使用默认属性(即:线程间共享)。

对于互斥量mutex的初始化有两种方式:

静态初始化:如果互斥锁 mutex 是静态分配的,即:定义为全局变量,或加了static关键字修饰,可以直接使用宏进行初始化。e.g. pthead_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER;

动态初始化:如果互斥锁mutex定义为局部变量,则应采用动态初始化。e.g. pthread_mutex_init(&mutex, NULL)

##pthread_mutex_destroy函数

函数原型:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

函数作用:销毁一个互斥锁

pthread_mutex_lock函数

函数原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);

函数作用:

对共享资源进行加锁。可理解为将mutex--(或-1);

如果加锁不成功,则该线程将阻塞,直到持有该互斥量的其他线程解锁为止。

注意:在访问共享资源前加锁,访问结束后立即解锁。锁的“粒度”应越小越好。

pthread_mutex_unlock函数

函数原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

函数作用:

对共享资源解锁。可理解为将mutex ++(或+1);

在解锁的同时,会将阻塞在该锁上的所有线程全部唤醒,至于哪个线程先被唤醒,取决于优先级、调度。默认情况下:先阻塞的线程会先被唤醒。

##pthread_mutex_trylock函数

函数原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

函数作用:对共享资源尝试加锁。它与pthread_mutex_lock函数的区别是,使用lock函数对共享资源进行加锁时,如果加锁不成功,则线程就阻塞;而如果使用trylock,则加锁不成功时不会阻塞当前线程,而是立即返回一个值来描述互斥锁的状况。

死锁:

线程试图对同一个互斥量A加锁两次。

线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁

详谈Linux操作系统编程的互斥量mutex


责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11225

    浏览量

    208903
  • 操作系统
    +关注

    关注

    37

    文章

    6737

    浏览量

    123188
  • 编程
    +关注

    关注

    88

    文章

    3591

    浏览量

    93592
收藏 人收藏

    评论

    相关推荐

    Linux内核同步机制mutex详解

    linux内核中,互斥mutex是一种保证CPU串行运行的睡眠锁机制。和spinlock类似,都是同一个时刻只有一个线程进入临界资源,不同的是,当无法获取锁的时候,spinlock
    发表于 06-26 16:05 1042次阅读

    Linux高级编程---互斥

    Linux系统里,有很多锁的应用,包括互斥锁,文件锁,读写锁等等,信号其实也应该是锁的一种。使用锁的目的是为了达到进程、线程之间的同步作用,使共享资源在同一时间内,只有能有一个进程
    发表于 01-13 10:07

    Linux操作系统安装与使用

    嵌入式网络编程+嵌入式Linux系统一、Linux操作系统安装与使用(命令)二、Linux开发工
    发表于 11-05 08:25

    为何将Linux操作系统划分为用户和内核

    linux_C网络编程概述嵌入式网络编程==嵌入式Linux_C系统编程(文件、进程、进程间通信、多线程、网络、大并发网络服务器、数据库、s
    发表于 12-15 08:35

    Linux系统编程重点学习标准I/O库

    Makefile脚本编写等知识,嵌入式开发环境的搭建。3Linux系统编程重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、
    发表于 12-15 06:45

    Linux操作系统安装与使用

    嵌入式网络编程+嵌入式Linux系统Linux操作系统安装与使用(命令)Linux开发工具(gc
    发表于 12-22 07:47

    Linux操作系统安装与使用方法

    嵌入式网络编程+嵌入式Linux系统Linux操作系统安装与使用(命令)Linux开发工具(gc
    发表于 12-23 06:57

    什么是Linux系统编程

    什么是Linux系统编程Linux系统编程也叫Linux下的高级编程,是介于应用层和驱动层之间
    发表于 12-23 07:30

    RT-Thread操作系统互斥的使用方法与场合介绍

    的线程避免了系统资源被任何中间优先级的线程抢占。互斥量控制块在 RT-Thread 中,互斥量控制块是操作系统用于管理互斥
    发表于 08-03 11:26

    是否可以为linux操作系统编译并在基于debian的rasperry操作系统中运行?

    STM32CubeProgrammer 有一个 C++ API,允许创建使用 qt creator 编译的程序。是否可以为 linux 操作系统编译并在基于 debian 的 rasperry 操作系统中运行?
    发表于 12-06 06:01

    linux系统编程_中文版

    linux系统编程_中文版
    发表于 10-29 10:17 0次下载
    <b class='flag-5'>linux</b><b class='flag-5'>系统编程</b>_中文版

    Linux多线程同步互斥Mutex详解

    嵌入式linux中文站向各位爱好者介绍linux常见同步方式互斥Mutex的使用方法1. 初始化:在
    发表于 04-02 14:45 293次阅读

    Linux 多线程互斥互斥

    调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。互斥模型#include pthread_mutex_t mute
    发表于 04-02 14:47 259次阅读

    详谈Linux操作系统编程的条件变量

    条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补
    的头像 发表于 09-27 15:23 1970次阅读
    <b class='flag-5'>详谈</b><b class='flag-5'>Linux</b><b class='flag-5'>操作系统编程</b>的条件变量

    为什么我们要掌握Linux系统编程

    为什么我们要掌握Linux系统编程
    的头像 发表于 05-17 10:00 836次阅读