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

    文章

    11191

    浏览量

    208623
  • 线程
    +关注

    关注

    0

    文章

    503

    浏览量

    19627
收藏 人收藏

    评论

    相关推荐

    Linux高级编程---互斥

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

    信号量、互斥、自旋

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

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

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

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

    1. LiteOS的互斥 1.1. 互斥 在多任务环境下,往往存在多个任务竞争同一共享资源的应用场景,互斥
    发表于 03-13 16:19 1140次阅读
    华为物联网操作系统LiteOS内核教程05-<b class='flag-5'>互斥</b><b class='flag-5'>锁</b>

    两个线程和互斥如何形成死循环?

    两个线程,两个互斥如何形成死锁?程序流程图如下: 程序流程图 如上图所示: t0时刻,主线程创建子线程,并初始化互斥mutex1、mutex2; t1时刻,主线程申请到了mutex
    的头像 发表于 01-02 16:47 1454次阅读
    两个线程和<b class='flag-5'>互斥</b><b class='flag-5'>锁</b>如何形成死循环?

    深入了解互斥、条件变量、读写以及自旋

    C++11只包含其中的部分。接下来我主要通过pthread的API来展开本文。 mutex(互斥量) mutex(mutual exclusive)即互斥量(互斥体)。也便是常说的互斥
    的头像 发表于 11-01 10:02 1845次阅读

    Linux中的伤害/等待互斥介绍

    序言:近期读Linux 5.15的发布说明,该版本合并了实时机制,当开启配置宏CONFIG_PREEMPT_RT的时候,这些被基于实时互斥
    的头像 发表于 11-06 17:27 2600次阅读

    Linux下线程间通讯--互斥

    互斥是一种简单的加锁的方法来控制对共享资源的存取,当多个线程访问公共资源时,为了保证同一时刻只有一个线程独占资源,就可以通过互斥加以限制,在一个时刻只能有一个线程掌握某个
    的头像 发表于 08-24 15:53 1917次阅读
    <b class='flag-5'>Linux</b>下线程间通讯--<b class='flag-5'>互斥</b><b class='flag-5'>锁</b>

    Linux实例:多线程和互斥到底该如何使用

    最近在写多进程和Linux中的各种的文章,总觉得只有文字讲解虽然能够知道多进程和互斥是什么,但是还是不知道到底该怎么用。
    发表于 05-18 14:16 350次阅读
    <b class='flag-5'>Linux</b>实例:多线程和<b class='flag-5'>互斥</b><b class='flag-5'>锁</b>到底该如何使用

    自旋互斥的区别有哪些

    自旋 自旋互斥很相似,在访问共享资源之前对自旋进行上锁,在访问完成后释放自旋(解锁)
    的头像 发表于 07-21 11:19 9294次阅读

    互斥不能在中断中使用?

    互斥是一种特殊的二值信号量,因为它解决了优先级翻转的问题。
    的头像 发表于 07-25 15:36 2298次阅读

    互斥、条件变量、读写、自旋及信号量介绍

    一、互斥(同步) 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西
    的头像 发表于 11-10 16:16 1631次阅读
    <b class='flag-5'>互斥</b><b class='flag-5'>锁</b>、条件变量、读写<b class='flag-5'>锁</b>、自旋<b class='flag-5'>锁</b>及信号量介绍

    互斥和自旋的区别 自旋临界区可以被中断吗?

    互斥和自旋的区别 自旋临界区可以被中断吗? 互斥和自旋
    的头像 发表于 11-22 17:41 730次阅读

    自旋互斥的使用场景是什么

    自旋互斥是两种常见的同步机制,它们在多线程编程中被广泛使用。在本文中,我们将介绍自旋互斥
    的头像 发表于 07-10 10:05 800次阅读

    互斥和自旋的实现原理

    互斥和自旋是操作系统中常用的同步机制,用于控制对共享资源的访问,以避免多个线程或进程同时访问同一资源,从而引发数据不一致或竞争条件等问题。 互斥
    的头像 发表于 07-10 10:07 371次阅读