信号量(Semaphore) 和 互斥锁(Mutex) 的区别

  1. 基本概念

    互斥锁(Mutex):就像一把锁,任何时候只能有一个人(线程)拥有这把锁。其他人必须等着,直到这个人释放锁才能继续操作。互斥锁的作用是确保某段代码(或资源)同一时刻只有一个线程能够访问。

    信号量(Semaphore):想象成一个计数器。它有一个数字,表示当前可以访问某个资源的“线程数量”。当数字是大于零时,就可以允许相应数量的线程进入临界区(即执行代码),每进一个线程就把数字减一,离开一个线程就加一。如果数字是零,那么其他线程就会被阻塞,直到有线程离开并释放信号量。

  2. 举个生活中的例子
    互斥锁的例子:

假设你家只有一把钥匙,门上有一个锁。这个门代表共享资源,只有一个线程(或者说人)可以打开门进入。

当你锁上门时,其他人就不能进去,必须等你出来再进。
这个过程中,只有一个人能进入,而其他人必须排队等着。

信号量的例子:

想象有一个停车场,里面有 3 个停车位。你和其他 2 个人都需要停车。

假如停车场的“信号量”是 3,表示最多 3 个人可以同时停车。
当你停车后,信号量就变成 2,其他两个人可以继续停车,直到所有停车位都满了。
如果停车场满了,其他人就不能停车,得等到有人开走了(信号量变回大于 0)才能进入。
  1. 主要区别
    特性	互斥锁(Mutex)	信号量(Semaphore)
使用目的	保证资源的独占访问,一次只允许一个线程访问。	控制多个线程同时访问资源的数量。
计数方式	只有 1 或 0,两者之间互斥。	可以设置任意数量(比如,3、5等)。
锁的拥有者	锁的拥有者是加锁的线程,只有拥有者可以解锁。	没有特定的拥有者,任何线程都可以增加或减少信号量。
适用场景	保护临界区,确保一次只有一个线程能访问资源。	限制并发线程数,控制资源的最大并发数。
阻塞行为	如果一个线程加锁,其他线程必须等待直到解锁。	如果信号量为零,线程会等待直到有线程释放信号量。

  2. 生活中的应用场景

    互斥锁(Mutex):
    假设你正在写日记,这本日记本是共享的,其他人不能同时写。所以,你上锁后,其他人就不能写日记,必须等你写完并且“解锁”日记本。互斥锁保证同一时刻只有一个人能操作。

    信号量(Semaphore):
    假设有 3 个共享的计算机,大家都可以用它来上网。如果只有 3 台计算机可用,信号量就是 3,表示最多有 3 个人可以同时使用。如果你在用,信号量会减少到 2,表示还有 2 台可用。如果有 4 个人想用,第四个人就得等,直到有一个人用完离开。

  3. 总结:

    互斥锁(Mutex) 更像是“独占”的锁,一次只能有一个线程访问资源,其他线程必须等着。
    信号量(Semaphore) 更像是一个限额计数器,它允许多个线程并发访问资源,但同时访问的线程数是有限的。

这样理解下来,你可以把互斥锁当做一个“只能有一个线程访问”的锁,而信号量当做“控制资源能被多少线程同时访问”的计数器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值