Concurrency 锁、互斥、信号量。。。什么';有什么区别?
我听说过这些与并发编程有关的词,但它们之间有什么区别?锁只允许一个线程进入被锁定的部分,并且锁不与任何其他进程共享Concurrency 锁、互斥、信号量。。。什么';有什么区别?,concurrency,locking,mutex,semaphore,Concurrency,Locking,Mutex,Semaphore,我听说过这些与并发编程有关的词,但它们之间有什么区别?锁只允许一个线程进入被锁定的部分,并且锁不与任何其他进程共享 互斥锁与锁相同,但可以是系统范围的(由多个进程共享) A与互斥锁的作用相同,但允许x个线程进入,例如,这可用于限制同时运行的cpu、io或ram密集型任务的数量 有关互斥和信号量之间差异的更详细的帖子,请阅读 您还拥有读/写锁,在任何给定时间允许无限数量的读取器或一个写入器。我的理解是,互斥锁只能在单个进程内使用,但可以跨多个线程使用,而信号量可以跨多个进程及其对应的线程集使用 此
互斥锁与锁相同,但可以是系统范围的(由多个进程共享) A与互斥锁的作用相同,但允许x个线程进入,例如,这可用于限制同时运行的cpu、io或ram密集型任务的数量 有关互斥和信号量之间差异的更详细的帖子,请阅读
您还拥有读/写锁,在任何给定时间允许无限数量的读取器或一个写入器。我的理解是,互斥锁只能在单个进程内使用,但可以跨多个线程使用,而信号量可以跨多个进程及其对应的线程集使用 此外,互斥锁是二进制的(它要么被锁定,要么被解锁),而信号量有计数的概念,或者是一个包含多个锁定和解锁请求的队列 有人能证实我的解释吗?我讲的是Linux,特别是红帽企业Linux(RHEL)版本6,它使用内核2.6.32。看看John Kopplin的文章 在线程间的同步部分,他解释了事件、锁、互斥、信号量和可等待计时器之间的区别 互斥锁一次只能由一个线程拥有,使线程能够 协调对共享资源的互斥访问 临界截面对象提供与此类似的同步 由互斥对象提供,但关键部分对象可以 仅由单个进程的线程使用 互斥和临界区之间的另一个区别是 临界截面对象当前由另一个线程拥有,
EnterCriticalSection()
无限期地等待所有权,而
与互斥对象一起使用的WaitForSingleObject(),允许您
指定超时
信号量将计数保持在零和某个最大值之间,
限制同时访问数据库的线程数
共享资源
Wikipedia有一个很好的章节介绍: 互斥锁本质上与二进制信号量相同 有时使用相同的基本实现。两者的区别 它们是: 互斥体有一个所有者的概念,即进程 锁定了互斥锁。只有锁定互斥锁的进程才能 打开它。相反,信号量没有所有者的概念。任何 进程可以解锁信号量 与信号量不同,互斥锁提供 优先级反转安全。由于互斥体知道其当前所有者,因此 在任何情况下,都有可能提升所有者的优先级 高优先级任务开始等待互斥锁 互斥体还提供 删除安全,其中无法删除保存互斥体的进程 意外删除。信号量不提供这一点
关于这些词有很多误解 这是前一篇文章()的内容,适合这里: 1)临界段=用于允许在一个进程内从多个其他线程执行一个活动线程的用户对象。其他未选择的线程(@acquisiting this object)将进入睡眠状态 [没有进程间功能,非常原始的对象] 2)互斥信号量(又称互斥)=内核对象,用于允许在不同进程之间执行多个活动线程中的一个活动线程。其他未选择的线程(@acquisiting this object)将进入睡眠状态。此对象支持线程所有权、线程终止通知、递归(来自同一线程的多个“获取”调用)和“优先级反转避免” [进程间功能,使用非常安全,一种“高级”同步对象] 3)计数信号量(aka Semaphore)=内核对象,用于允许从许多其他线程执行一组活动线程。其他未选择的线程(@acquisiting this object)将进入睡眠状态 [然而,进程间功能使用起来并不十分安全,因为它缺少以下“互斥”属性:线程终止通知、递归?、“优先级反转避免”等] 4)现在,谈到“旋转锁”,首先是一些定义: 临界区域=由2个或多个进程共享的内存区域 Lock=其值允许或拒绝进入“临界区域”的变量。(它可以实现为一个简单的“布尔标志”) Busy waiting=持续测试变量,直到出现某个值 最后: 自旋锁(又称自旋锁)=一种使用忙等待的锁。(通过xchg或类似的原子操作获取锁) [无线程休眠,主要用于内核级别。不适用于用户级代码] 最后一点,我不确定,但我可以向您打赌,上面的前3个同步对象(#1、#2和#3)将使用这个简单的beast(#4)作为其实现的一部分 祝你今天愉快 参考文献: -实时嵌入式系统的概念,由李青与姚凯琳合著(CMP图书) -Andrew Tanenbaum(培生教育国际)的《现代操作系统》(第三版) -Jeffrey Richter为Microsoft Windows编程应用程序(第四版)(
X Y Z Name
--- --- --- ------------------------
0 ∞ ∞ Semaphore
0 ∞ 1 Binary Semaphore
0 1 ∞ SemaphoreSlim
0 1 1 Binary SemaphoreSlim(?)
1 ∞ ∞ Recursive-Mutex(?)
1 ∞ 1 Mutex
1 1 ∞ N/A(?)
1 1 1 Lock/Monitor
lock(netWorth) {
...
}