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

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

3天内不再提示

Linux互斥锁的作用 互斥锁是什么

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-21 11:13 次阅读

1、互斥锁

互斥锁(mutex),在访问共享资源之前对互斥锁进行上锁,在访问完成后释放互斥锁(解锁);对互斥锁进行上锁之后,任何其它试图再次对互斥锁进行加锁的线程都会被阻塞,直到当前线程释放互斥锁。如果释放互斥锁时有一个以上的线程阻塞,那么这些阻塞的线程会被唤醒,它们都会尝试对互斥锁进行加锁,当有一个线程成功对互斥锁上锁之后,其它线程就不能再次上锁了,只能再次陷入阻塞,等待下一次解锁。

初始化互斥锁

#include< pthread.h >intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*attr);

加锁、解锁

#include< pthread.h >intpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_unlock(pthread_mutex_t*mutex);

当互斥锁已经被其它线程锁住时,调用 pthread_mutex_lock()函数会被阻塞,直到互斥锁解锁;如果线程不希望被阻塞,可以使用 pthread_mutex_trylock()函数;调用 pthread_mutex_trylock()函数尝试对互斥锁进行加锁,如果互斥锁处于未锁住状态,那么调用 pthread_mutex_trylock()将会锁住互斥锁并立马返回,如果互斥锁已经被其它线程锁住,调用 pthread_mutex_trylock()加锁失败,但不会阻塞,而是返回错误码 EBUSY。

#include< pthread.h >intpthread_mutex_trylock(pthread_mutex_t*mutex);

销毁互斥锁(不再需要互斥锁时,应该将其销毁)

#include< pthread.h >intpthread_mutex_destroy(pthread_mutex_t*mutex);

互斥锁死锁

如果一个线程试图对同一个互斥锁加锁两次,该线程会陷入死锁状态,一直被阻塞永远出不来;这就是出现死锁的一种情况。

有时,一个线程需要同时访问两个或更多不同的共享资源,而每个资源又由不同的互斥锁管理。当超过一个线程对同一组互斥锁(两个或两个以上的互斥锁)进行加锁时,就有可能发生死锁;譬如,程序中使用一个以上的互斥锁,如果允许一个线程一直占有第一个互斥锁,并且在试图锁住第二个互斥锁时处于阻塞状态,但是拥有第二个互斥锁的线程也在试图锁住第一个互斥锁。因为两个线程都在相互请求另一个线程拥有的资源,所以这两个线程都无法向前运行,会被一直阻塞,于是就产生了死锁。

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

    关注

    87

    文章

    10991

    浏览量

    206742
  • 线程
    +关注

    关注

    0

    文章

    489

    浏览量

    19500
收藏 人收藏

    评论

    相关推荐

    Linux高级编程---互斥

    Linux系统里,有很多的应用,包括互斥,文件,读写等等,信号量其实也应该是
    发表于 01-13 10:07

    RT-thread内核之互斥

    ; /**< value of mutex *///此互斥的值 rt_uint8_toriginal_priority; /**< priority of last thread hold
    发表于 03-06 17:23

    【MiCOKit试用体验】庆科MiCO系统篇(3)MiCO RTOS互斥

    本帖最后由 gjianw217 于 2015-10-25 15:45 编辑 在本帖子中,主要分析一下庆科MiCO RTOS的互斥,具体包括:OS互斥MiCO
    发表于 10-24 17:02

    信号量、互斥、自旋

    信号量、互斥、自旋http://bbs.edu118.com/forum.php?mod=viewthread&tid=488&fromuid=231(出处: 信盈达IT技术社
    发表于 08-29 09:48

    Linux C 多线程编程之互斥与条件变量实例详解

    一、互斥互斥量从本质上说就是一把, 提供对共享资源的保护访问。1. 初始化:在Linux下, 线程的
    发表于 06-03 17:13

    小熊派华为物联网操作系统LiteOS内核教程05-互斥

    本帖最后由 小熊派开源社区 于 2020-2-24 17:52 编辑 1. LiteOS的互斥1.1. 互斥锁在多任务环境下,往往存在多个任务竞争同一共享资源的应用场景,互斥
    发表于 01-19 11:02

    请问任务被挂起时会不会自动释放互斥

    请问,任务被挂起时,会不会自动释放互斥。也就是这个任务正在使用这个互斥,刚好被挂起了。
    发表于 07-16 05:52

    【HarmonyOS HiSpark AI Camera 】第三次回眸-鸿蒙的线程和互斥

    / ... ad-0000001050141770提供的API进行编程。多线程在多核处理器可以加快运行时间,在单核处理器上没有什么优势。线程同步,最常用的是互斥、条件变量、信号量和读写。我的这个例子里面,使用漏桶算法
    发表于 11-13 20:01

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发——互斥

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发——互斥本示例将演示如何在BearPi-HM_Nano开发板上使用cmsis 2.0 接口使用互斥来同步任务Mutex API分析
    发表于 04-09 10:02

    互斥量源码分析测试

    文章目录互斥量源码分析测试参考资料:RTT官网文档关键字:分析RT-Thread源码、stm32、RTOS、互斥量。互斥量在其他书籍中的名称:mutex :互斥
    发表于 08-24 06:01

    鸿蒙内核实现用户态快速互斥Futex设计资料合集

    Futex(Fast userspace mutex,用户态快速互斥),系列篇简称 快 ,是一个在 Linux 上实现锁定和构建高级抽象
    发表于 03-23 14:12

    如何在RK2206上使用鸿蒙LiteOS-M内核接口进行互斥编程开发

    实验内容本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行互斥编程开发。程序设计互斥也叫做互斥型信号量,
    发表于 08-05 16:28

    RT-Thread实现的互斥属性包括哪些

    * lock);函数返回 lock无效返回EINVAL,否则返回0或EPERM。互斥属性RT-Thread实现的互斥属性包括互斥
    发表于 08-12 15:06

    Linux 多线程互斥互斥

    情况是指可以允许多个访问者同时访问资源互斥量Mutex:本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥互斥量使同时只能有一个线程访问数据,可以看做一种的
    发表于 04-02 14:47 201次阅读

    使用Linux互斥体实现互斥点灯

    互斥访问是指一次只有一个线程可以访问共享资源,不能递归申请互斥体。使用互斥体时要注意如下几点。
    的头像 发表于 04-13 15:13 668次阅读
    使用<b class='flag-5'>Linux</b><b class='flag-5'>互斥</b>体实现<b class='flag-5'>互斥</b>点灯