第二章第八节,关于信号量可能的线程不安全问题有误。
Opened this issue · 3 comments
Gordonzxr commented
“虽然表面上看信号量机制没什么明显的问题,如果信号量的等待和通知操作都是原子的,确实没什么问题。但如果不是,或者两个操作有一个终止了,就会导致糟糕的情况。
举个例子,假设有两个并发的线程,都在等待一个信号量,目前信号量的内部值为1。假设第线程A将信号量的值从1减到0,这时候控制权切换到了线程B,线程B将信号量的值从0减到-1,并且在这里被挂起等待,这时控制权回到线程A,信号量已经成为了负值,于是第一个线程也在等待。
这样的话,尽管当时的信号量是可以让线程访问资源的,但是因为非原子操作导致了所有的线程都在等待状态。”
查阅了相关部分资料,包括ChatGPT,都认为Python的信号量通知和等待操作是线程安全的,实际上不存在这样非原子操作可能引起的问题。
希望帮助查证。
laixintao commented
这里是不是说信号量的实现如果不是原子的,会有问题?
Gordonzxr commented
这里是不是说信号量的实现如果不是原子的,会有问题?
是的,但是我查阅了Galvin的Operating Systems,他们认为现代计算机和操作系统中,信号量的工作方式和互斥锁一致,而且Galvin在书中提到,wait操作是原子化的,而且这是通过现代CPU的一个原子操作“test and set”实现的。
laixintao commented
嗯,原文这段中将的都是「如果」的情况吧。