zoukankan      html  css  js  c++  java
  • 互斥量和信号量的区别

    互斥量和信号量的区别

    来源 https://www.cnblogs.com/lbsx/archive/2009/08/03/1537698.html

    1. 互斥量用于线程的互斥,信号量用于线程的同步。

    这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

    互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

    同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

    以上区别是主要想记住的。

    note:信号量可以用来实现互斥量的功能

    2. 互斥量值只能为0/1,信号量值可以为非负整数。

    也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

    3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

    作者:fleuria  编辑于 2016-12-16
    链接:https://www.zhihu.com/question/47704079/answer/136200849

    Mutex 相比信号量增加了所有权的概念,一只锁住的 Mutex 只能由给它上锁的线程解开,只有系铃人才能解铃。Mutex 的功能也就因而限制在了构造临界区上。

    一元信号量则可以由任一线程解开。这样多出来的一份语义,就是解决读者-写者问题的工具。比如某进程读取磁盘并进入睡眠,等待中断读取盘块结束之后来唤醒它。这就是可以祭出一元信号量的一个情景,而 Mutex 是解决不了的。『信号量』 这个词本身来自火车站的信号灯,其实本来就暗含着一层 『通知』 的含义。

    『同步』这个词也可以拆开看,一侧是等待数据的『事件』或者『通知』,一侧是保护数据的 『临界区』。信号量可以满足这两个功能,但是可以注意到两个功能的应用场景还是蛮大的,有 do one thing and do it best 的空间。linux 内核曾将 semaphore 作为同步原语,后面代码变得较难维护,刷了一把 mutex 变简单了不少还变快了,需要『通知』 的场景则替换为了 completion variable。

    Goodbye semaphores?

    Difference between completion variables and semaphores

    How are mutexes and semaphores different with respect to their implementation in a Linux kernel?

    Some facts on mutex in Linux.
    - only one task can hold the mutex at a time
    - only the owner can unlock the mutex (unlike the semaphore)
    - multiple unlocks are not permitted
    - recursive locking is not permitted (since here count can be maximum 1 unlike the semaphore where for e.g count = 5)
    - task may not exit with mutex held
    - memory areas where held locks reside must not be free
    - mutexes may not be used in hardware or software interrupt contexts such as tasklets and timers
     
    Linux kernel一直有提供两大类锁,busy wait的spinlock,和mutex或者semaphore,后者的实现里有地方会用到spinlock。最早时mutex只是一个binary semaphore的wrapper(两三行的macro),语义上不保证只有持有者可以解锁。2006年时如上面这个链接里的文档所说正式引入了真正的mutex,semaphore成为了二等公民。
     

    ============== End

  • 相关阅读:
    python,可变参数
    python process,queue
    python 进程池Pool
    python 中的set与list,tuple
    python 元组tuple
    深夜装ubuntu
    python中的协程
    python Queue在两个地方
    (转载)Spring mvc中@RequestMapping 6个基本用法小结
    数据库jdbc连接--【DRP】
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12089946.html
Copyright © 2011-2022 走看看