python-parallel-programming-cookbook-cn icon indicating copy to clipboard operation
python-parallel-programming-cookbook-cn copied to clipboard

第二章第八节,关于信号量可能的线程不安全问题有误。

Open Gordonzxr opened this issue 1 year ago • 3 comments

“虽然表面上看信号量机制没什么明显的问题,如果信号量的等待和通知操作都是原子的,确实没什么问题。但如果不是,或者两个操作有一个终止了,就会导致糟糕的情况。 举个例子,假设有两个并发的线程,都在等待一个信号量,目前信号量的内部值为1。假设第线程A将信号量的值从1减到0,这时候控制权切换到了线程B,线程B将信号量的值从0减到-1,并且在这里被挂起等待,这时控制权回到线程A,信号量已经成为了负值,于是第一个线程也在等待。 这样的话,尽管当时的信号量是可以让线程访问资源的,但是因为非原子操作导致了所有的线程都在等待状态。”

查阅了相关部分资料,包括ChatGPT,都认为Python的信号量通知和等待操作是线程安全的,实际上不存在这样非原子操作可能引起的问题。 希望帮助查证。

Gordonzxr avatar Jun 18 '24 02:06 Gordonzxr

这里是不是说信号量的实现如果不是原子的,会有问题?

laixintao avatar Jun 19 '24 09:06 laixintao

这里是不是说信号量的实现如果不是原子的,会有问题?

是的,但是我查阅了Galvin的Operating Systems,他们认为现代计算机和操作系统中,信号量的工作方式和互斥锁一致,而且Galvin在书中提到,wait操作是原子化的,而且这是通过现代CPU的一个原子操作“test and set”实现的。

Gordonzxr avatar Sep 01 '24 18:09 Gordonzxr

嗯,原文这段中将的都是「如果」的情况吧。

laixintao avatar Sep 12 '24 06:09 laixintao