多線程的時候壮韭,我們會用到同步與互斥纹因。一般是獲取互斥鎖瞭恰,其余的線程就會陷入阻塞寄疏。但是在協(xié)程中,可能出現(xiàn)棧幀切換之后重新獲取鎖的問題驳棱,這時候能獲取成功嗎社搅?
答案分情況而論形葬,如果是可重入鎖,是可以獲取成功的淌实,原因可以看可重入鎖的定義拆祈。
A reentrant lock is a synchronization primitive that may be acquired multiple times by the same thread.
也就是說放坏,內(nèi)核對于鎖屬主的判別是基于線程ID的淤年,不要妄想用可重入鎖避開不同協(xié)程間的資源爭用問題蜡豹。
# coding=utf-8
import threading
lock = threading.RLock()
def consumer():
x = yield 11
lock.acquire()
y = yield x * x
z = yield y * y
lock.release()
def producer():
c = consumer()
print(next(c))
lock.acquire()
print(c.send(11))
print(c.send(22))
lock.release()
if __name__ == '__main__':
producer()
當然豹休,如果采用不可重入鎖桨吊,這個就更糟糕了,直接就導(dǎo)致所有的協(xié)程死掉了洛搀。
理論上留美,操作系統(tǒng)的鎖機制可以理解為余量為1的信號量即可谎砾,獲取和占用都要識別線程ID。