为什么锁不能由不同的线程解锁,而二进制信号量可以?

问题描述 投票:0回答:1

就并发编程中锁和二进制信号量的概念而言,为什么没有锁住锁的线程不能解锁锁,而没有锁住锁的线程可以释放/发出信号量?不获取/等待它?

二进制信号量是锁吗?那么我的问题应该是二进制信号量还是非二进制信号量的锁?

谢谢。

concurrency operating-system synchronization locking semaphore
1个回答
0
投票

因为锁(我假设你在这里指的是某种形式的互斥锁)和二进制信号量具有不同的语义和实现。

二进制信号量基于简单的计数器原语,您可以对其应用原子增量 (lock inc [counter]) 和减量 (lock dec [counter]) 操作。因此,信号量并不关心谁实际请求这些操作。它只关心如何确保两者都是原子的。

相比之下,互斥体实现所有权语义并基于原子 CAS 操作(lock cmpxchg [counter]、expected_val、new_val)。因此,当你想要获取锁时,你希望在互斥变量中找到一些预定义的值(通常为 NULL),并在成功时写入你的线程 ID。当你想要释放互斥体时,你希望在互斥体变量中找到你的线程ID,如果成功则将NULL写入其中。笔记!这个东西之所以起作用只是因为 CAS 指令的特性。它通过一个原子操作执行三个步骤:

  1. 从内存中读取值
  2. 将读取的值与寄存器中的“预期”参数进行比较
  3. 当且仅当它们相等时,它将“新”值从寄存器写回内存。
© www.soinside.com 2019 - 2024. All rights reserved.