就并发编程中锁和二进制信号量的概念而言,为什么没有锁住锁的线程不能解锁锁,而没有锁住锁的线程可以释放/发出信号量?不获取/等待它?
二进制信号量是锁吗?那么我的问题应该是二进制信号量还是非二进制信号量的锁?
谢谢。
因为锁(我假设你在这里指的是某种形式的互斥锁)和二进制信号量具有不同的语义和实现。
二进制信号量基于简单的计数器原语,您可以对其应用原子增量 (lock inc [counter]) 和减量 (lock dec [counter]) 操作。因此,信号量并不关心谁实际请求这些操作。它只关心如何确保两者都是原子的。
相比之下,互斥体实现所有权语义并基于原子 CAS 操作(lock cmpxchg [counter]、expected_val、new_val)。因此,当你想要获取锁时,你希望在互斥变量中找到一些预定义的值(通常为 NULL),并在成功时写入你的线程 ID。当你想要释放互斥体时,你希望在互斥体变量中找到你的线程ID,如果成功则将NULL写入其中。笔记!这个东西之所以起作用只是因为 CAS 指令的特性。它通过一个原子操作执行三个步骤: