首页 > 其他分享 >信号量和互斥锁详解 MarkDown版

信号量和互斥锁详解 MarkDown版

时间:2023-05-22 19:06:29浏览次数:40  
标签:MarkDown 信号量 互斥 锁定 线程 mutex 多线程


信号量和互斥锁详解

参考链接1
参考链接2
参考链接3
参考链接4

详细说明:

信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

   互斥锁(又名互斥量)强调的是资源的访问互斥:互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,再解锁。

   pthread_mutex_lock() 和 pthread_mutex_unlock() 函数调用 提供了一种 相互排斥的方法(互斥对象即由此得名)。两个线程不能同时对同一个互斥对象加锁。
    互斥对象是这样工作的。如果线程 a 试图锁定一个互斥对象,而此时线程 b 已锁定了同一个互斥对象时,线程 a 就将进入睡眠状态。一旦线程 b 释放了互斥对象(通过 pthread_mutex_unlock() 调用),线程 a 就能够锁定这个互斥对象(换句话说,线程 a 就将从 pthread_mutex_lock() 函数调用中返回,同时互斥对象被锁定)。同样地,当线程 a 正锁定互斥对象时,如果线程 c 试图锁定互斥对象的话,线程 c 也将临时进入睡眠状态。对已锁定的互斥对象上调用 pthread_mutex_lock() 的所有线程都将进入睡眠状态,这些睡眠的线程将“排队”访问这个互斥对象。

   pthread_mutex_lock()函数锁住由mutex指定的mutex 对象。如果mutex已经被锁住,调用这个函数的线程阻塞直到mutex可用为止。这跟函数返回的时候参数mutex指定的mutex对象变成锁住状态, 同时该函数的调用线程成为该mutex对象的拥有者。

   互斥锁死锁问题:例如两个线程都需要锁定互斥锁1和互斥锁2,a线程先锁定互斥锁1,b线程先锁定互斥锁2,这时就出现了死锁。此时我们可以使用函数 pthread_mutex_trylock,它是函数pthread_mutex_lock的非阻塞版本,当它发现死锁不可避免时,它会返回相应的信 息,程序员可以针对死锁做出相应的处理。另外不同的互斥锁类型对死锁的处理不一样,但最主要的还是要程序员自己在程序设计注意这一点。

   使用读写锁时 写锁如果在主线程加写锁会导致死锁 wrlock若申请不到锁则自旋

   信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的。
     也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。而线程互斥量则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进行操作。在有些情况下两者可以互换。

   添加信号量能保证写入数据后才能读取数据但是添加信号量后读和写不能再同一个线程中,如果添加信号后读和写在同一个线程中则很容易让当前线程进入休眠状态(死锁)。
     注意:当有两个线程时并且一个读线程一个写线程就可以使用信号量否则其他情况不要使用信号量 容易造成死锁

   信号量在判断到当前信号量小于0时会让当前线程处于休眠状态等待信号量而互斥锁则是将当前锁资源给加锁其他访问到此锁的线程会处于休眠状态这个机制让互斥锁不会将当前线程置为休眠状态。

   信号量和互斥锁的区别

   信号量和互斥锁的着眼点都为多线程,那么他们的区别是什么?

   1.信号量:是多线程同步用的,一个线程完成了某一动作就通过信号告诉别的线程,别的线程在进行某些动作。是Unix进程间通信的方式之一。

   2.互斥量:是多线程互斥用的,比如说,一个线程占用了某一资源,那么别的线程就无法访问,直到这个线程离开,其他线程才开始可以利用这个资源。是同一进程下的多线程的五种同步方式之一。

   3.区别

   ①.互斥量用于线程的互斥,信号量用于线程的同步,这是根本区别。也就是互斥和同步的区别。

   互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
     同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。


标签:MarkDown,信号量,互斥,锁定,线程,mutex,多线程
From: https://blog.51cto.com/u_16124099/6326569

相关文章

  • MarkDown如何输入数学公式
    MarkDown如何输入数学公式在MarkDown中输入如下下代码在使用时要去掉\这个符号加\符号是为了让markDown原样显示,不被解析成对应的markdown语法\<scripttype="text/javascript"src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></sc......
  • 锁机制和信号量机制实现水果问题,同步机制
    使用Semaphore类实现packagecom.huo.HelperClass.demo;importsun.security.krb5.internal.TGSRep;importjava.util.concurrent.Semaphore;/***@version1.0*@Author作者名*@Date2022/9/1311:26*///使用Semaphore实现水果同步问题publicclassFruitDem......
  • 协程并发下数据汇总:除了互斥锁,还有其他方式吗?
    1.简介本文介绍了在并发编程中数据汇总的问题,并探讨了在并发环境下使用互斥锁和通道两种方式来保证数据安全性的方法。首先,通过一个实例,描述了一个并发拉取数据并汇总的案例,并使用互斥锁来确保线程安全。然后,讨论了互斥锁的一些缺点,引出了通道作为一种替代方案,并介绍了通道的基......
  • 欢迎使用CSDN-markdown编辑器
    欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗Ctrl+B斜体Ctrl+I......
  • Java-Day-23( 线程二:线程终止 + 常用方法 + 用户线程 + 守护线程 + 线程生命周期 + Syn
    Java-Day-23线程终止setLoop()基本说明当线程完成任务后,会自动退出还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式练习使用publicclasstest1{publicstaticvoidmain(String[]args)throwsInterruptedException{Tt1=newT();......
  • Java Semaphore 信号量详解
    Semaphore基本使用场景Semaphore的基本使用场景是限制一定数量的线程能够去执行.举个简单的例子:一个单向隧道能同时容纳10个小汽车或5个卡车通过(1个卡车等效与2个小汽车),而隧道入口记录着当前已经在隧道内的汽车等效比重.比如1个小汽车和1个卡车,则隧道入口显示3.若隧道......
  • python高级技术(死锁、递归锁、信号量、Event时间、进程池、线程池、协程)
    一死锁和递归锁(了解)进程也有死锁与递归锁,使用方法类似所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。当你知......
  • Markdown 语法速查表
    Markdown官方教程Markdown速查表提供了所有Markdown语法元素的基本解释。如果你想了解某些语法元素的更多信息,请参阅更详细的 基本语法 和 扩展语法.基本语法这些是JohnGruber的原始设计文档中列出的元素。所有Markdown应用程序都支持这些元素。元素Markdown语......
  • markdown语法
    基础01markdown语法文件编辑器:typora标题一级标题#二级标题##...(最多六级)字体加粗**斜体*斜体加粗***废弃~~引用使用>引用分割线---***图片![图片名](本地图片地址/网络图片地址)超链接我的博客[超链接名](超链接地址)列表有序数字+句......
  • java学习第一天MarkDown学习
    Markdown学习标题三级标题#+空格表示一级标题,##+空格表示二级标题...最多到六级标题字体内容这是粗体****斜体这是斜体**斜体加粗这是斜体加粗每边个三个*删除线每边个两个~删除线引用">"表示引用分割线三个“-”表示分割线三个“*”也表示分割线图片 英......