1. 程式人生 > 其它 >RISC-V MCU低功耗場景的應用分析

RISC-V MCU低功耗場景的應用分析

13. GIL
背景:
1. 在CPython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,
由於C語言本身比較底層造成CPython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,
因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源增加了限制-全域性直譯器鎖

2. 首先需要明確的一點是GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。
就好比C++是一套語言(語法)標準,但是可以用不同的編譯器來編譯成可執行程式碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。
Python也一樣,同樣一段程式碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。像其中的JPython就沒有GIL

一個程序有且僅有一個的鎖,該鎖用於控制多執行緒同一時刻只能有一個執行緒使用CPU

釋放:
GIL鎖的釋放只需滿足以下兩個條件中的一個:
1.執行緒的時間片使用完畢(或者執行完一定行數的位元組碼)
2.執行緒遇到阻塞/等待的狀態,此時即使時間片沒有用完也會釋放GIL鎖

誤區:
1. 有些人會有一個誤區,認為一個執行緒完全執行完才會釋放GIL鎖給其他執行緒執行。這樣是錯的,這樣多執行緒就不是併發而是串行了。
2. 既然CPython解釋存在GIL是否意味每個執行緒在全域性變數就不用加Lock互斥鎖了呢?
這是一個嚴重錯誤的想法,為什麼使用者操作全域性資料還需要加Lock,
因為GIL的釋放時機我們無法控制-操作非常可能並沒有完成,而不像Lock那樣我們用完才釋放(操作完整)

14. threading Thread
使用繼承Thread的方式要重寫run()方法

15. 執行緒間通訊 Queue
Queue相比於普通的list結構而言,Queue是執行緒安全的,而list不是執行緒安全的。
原因是Queue內部使用了鎖和條件變數來進行執行緒同步,但是list沒有用到執行緒同步技術

Queue.get() 方法阻塞
Queue的join()方法必須配合task_done()方法一起使用!

Queue的join方法的喚醒條件:
1當佇列中所有任務被彈出,佇列中元素為0
2.每個被彈出的任務都執行了task_done()來標記這個任務已被完成

兩個條件缺一不可

16. 死鎖
同一把鎖巢狀,鎖等待自己這把鎖造成死鎖;
兩把不同的鎖巢狀,造成相互等待造成死鎖