**互斥量是一种保证互斥的锁 —— 同一时刻只有一个线程能持有它并进入被保护的临界区。**信号量把这一概念推广为允许最多 N 个并发持有者。
它是如何工作的
- 临界区:触及共享状态、不能并发运行的代码区域。
- 互斥量(mutual exclusion):进入临界区前获取,之后释放。第二个线程会阻塞直到它空闲。通常由获取它的线程拥有(只有该线程可以释放)。
- 信号量:持有一个 N 个许可的计数器。
acquire()减一(为 0 时阻塞),release()加一。互斥量本质上就是 N=1 的信号量,但带有所有权语义。
python
lock = threading.Lock()
():
lock:
a.balance -= amt
b.balance += amt
sem = threading.Semaphore()
():
sem:
db.execute(...)
