什么是并發控制?并發控制技術的原理,最基本的分鎖模式(排他鎖,共享鎖)
727
2022-05-30
前言
多線程,這個名詞大家應該比較熟悉。比如說在我們電腦的處理器一般是xxx核xxx線程,比如我的電腦的處理器是Intel Core i7-9750H,是6核12線程處理器,一般情況下,一個核同時只能有一個任務執行。多核時才可以支持多個線程同時執行。但通過采用超線程技術,Intel Core i7-9750H實現了增加一倍的線程,即達到了12個線程,使得對于多任務處理能夠更好的運行,但對于游戲這種對頻率 有更多需求的應用來說,多線程就沒什么太大優勢了,這時頻率起到了主要作用。
那么線程到底是什么呢?
線程(Thread)也叫輕量級進程,是操作系統能夠進行運算調度的最小單位,它被包涵在進程之中,是進程中的實際運作單位。線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。
簡單來說,多線程可以草率的理解為:同時執行多個不同的應用程序,相當于并行處理,同時做了多件事。很明顯,優勢很大。我們看看對它的評價:
每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。每個線程也都有自己的一組CPU寄存器,稱為線程的上下文,該上下文反映了線程上次運行該線程的CPU寄存器的狀態。指令指針和堆棧指針寄存器是線程上下文中兩個最重要的寄存器,線程總是在進程得到上下文中運行的,這些地址都用于標志擁有線程的進程地址空間中的內存。
好了,好了,是不是有些凌亂了,理論總是枯燥的,直接看看代碼,在實戰中理解吧,以下代碼在華為云ModelArts NoteBook中,使用CPU 2核下驗證。
1. 多線程初識
運行結果
可以看到兩個線程交替執行,work1先執行一次,打印了“0”,之后work2執行,打印了“0”,然后又是work1執行打印了“1”,以此類推。在程序運行中,你可以看到work1和work2同時打印了“0”,之后,又同時打印了“1”,“2”,仿佛work1和work2同時在運行一樣。
2. 線程同步
運行結果
注意,這里test2的每次運行結果可能不一樣,但最終結果是一樣的,即200 0000。
這里使用兩個線程對同一個變量操作,每個線程完成100 0000次累加,兩個線程同步后,共計完成 200 0000次累積,得到最終200 0000結果。
好了,多線程大概就是這樣了,還有其他的一些內容,以后有機會再來說。其實在Python中,無論處理器有多少個核,同時只能執行一個線程。這就是由于GIL的存在導致的。GIL的全稱是Global Interpreter Lock(全局解釋器鎖),來源是Python設計之初的考慮,為了數據安全所做的決定。某個線程想要執行,必須先拿到GIL,我們可以把GIL看作是“通行證”,并且在一個Python進程中,GIL只有一個,拿不到通行證的線程,就不允許進入CPU執行。
所以,想要充分利用多核CPU,就用多進程,注意不是剛下講的所線程哦,對于進程和線程的區別,可以簡單理解為進程是一個國家,線程是這個國家一個具體的城市,一個進程可以有多個線程,就像一個國家可以有多個城市,但一個線程要在一個進程的依賴下,就像我們寫跨國通信地址的時候,寫這個城市前,要先寫這個國家。因為每個進程有各自獨立的GIL,互不干擾,這樣就可以真正意義上的并行執行,在Python中,多進程的執行效率優于多線程(僅僅針對多核CPU而言,現在一般應該都是多核處理器了)。
昇騰 人工智能 AI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。