執行緒慣性指在多執行緒編程中的一種錯誤的心理狀態,它假定當前編寫的代碼執行完畢後會繼續執行下一條代碼。而實際上,在現代處理器中,執行緒隨時(當該執行緒的時間片用完時)可能被處理器凍結,而處理器被另一執行緒搶占(這裡指單處理器上的情況,在多處理器上,情況更加複雜)。
基本介紹
- 中文名:執行緒慣性
- 外文名:Thread inertia
- 領域:計算機編程
- 產生原因:慣性思維
- 解決方法:執行緒安全
- 有關術語:多執行緒
定義,執行緒安全,多執行緒編程,
定義
執行緒,有時被稱為輕量級進程(Lightweight Process,LWP),是程式執行流的最小單元。一個標準的執行緒由執行緒ID,當前指令指針(PC),暫存器集合和堆疊組成。另外,執行緒是進程中的一個實體,是被系統獨立調度和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它執行緒共享進程所擁有的全部資源。
執行緒慣性是指以單執行緒代碼執行方式來分析多執行緒代碼。在多執行緒編程中,代碼是並發、並行並且是異步執行的,與代碼順序執行相反。因此,如果程式執行的結果依賴於這兩個(或者可能更多)執行緒的順序,程式就可能出錯。因為執行緒執行具有不確定性,這種錯誤並不是每次都會出現,而且在某些特定的機器上可能永遠不會出現。因此,這種錯誤較難發現。在實際編程中,一般採用執行緒安全方法來解決執行緒慣性問題。
執行緒安全
執行緒安全是編程中的術語,指某個函式、函式館在多執行緒環境中被調用時,能夠正確地處理多個執行緒之間的共享變數,使程式功能正確完成。一般來說,執行緒安全的函式應該為每個調用它的執行緒分配專門的空間,來儲存需要單獨保存的狀態(如果需要的話),不依賴於“執行緒慣性”,把多個執行緒共享的變數正確對待(如,通知編譯器該變數為“易失(volatile)”型,阻止其進行一些不恰當的最佳化),而且,執行緒安全的函式一般不應該修改全局對象。很多C庫代碼(比如某些strtok的實現,它將“多次調用中需要保持不變的狀態”儲存在靜態變數中,導致不恰當的共享)不是執行緒安全的,在多執行緒環境中調用這些函式時,要進行特別的預防措施,或者尋找別的替代方案。以Java程式語言為例,編程的方法越來越高效和完善。針對執行緒安全問題,從Java2中非執行緒安全的 Hash Map 到後來提出了執行緒安全的 Hashtable 和Concurrent Hash Map,再到 Java8 的普及和套用又為執行緒安全問題提出了新的解決辦法。Java8 中新增了Lambda表達式、流和默認方法。提出了行為參數化的軟體開發模式。同時在 Lambda 表達式的基礎上提出了流處理。對於流處理這種較為新型的處理數據模式,由於流處理避免了多執行緒程式的執行緒臨界域訪問帶來的非執行緒安全問題,為程式開發者性能提高提供了新思路。
多執行緒編程
多執行緒(multithreading),是指從軟體或者硬體上實現多個執行緒並發執行的技術。具有多執行緒能力的計算機因有硬體支持而能夠在同一時間執行多於一個執行緒,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多處理(Chip-level multithreading)或同時多執行緒(Simultaneous multithreading)處理器。
軟體多執行緒。即便處理器只能運行一個執行緒,作業系統也可以通過快速的在不同執行緒之間進行切換,由於時間間隔很小,來給用戶造成一種多個執行緒同時運行的假象。這樣的程式運行機制被稱為軟體多執行緒。如微軟的Windows作業系統和Linux就是在各個不同的執行緒間來回切換,被稱為單人多任務作業系統。而DOS這類文字接口作業系統在一個時間只能處理一項工作,被視為單人單工作業系統。
在多執行緒編程模型中,執行緒間是相互獨立而又相互依賴的。使用多執行緒編程模型編程就是將進程的任務劃分為執行的執行緒,每一個執行緒為一個順序的單控制流,而所有執行緒都是並發、並行並且是異步執行的,這樣,多執行緒編程模型具有實現進程並行計算、節省記憶體空間、減少系統管理開銷、快速切換、(執行緒)通信易於實現等優點。多執行緒編程模型提供了一種新型的模組化編程思想和方法,這種方法能清晰地表達各種獨立事件的相互關係,但是這種多執行緒編程模型的並發和異步優點也帶來了一定的複雜度:並發和異機制帶來了執行緒間資源競爭無序性。因此需要引入同步機制來消除這種複雜度和實現執行緒間共享數據,以一致的順序執行一組操作。多執行緒編程提供一種新型的模組化思維方式和編程方式,它將獨立的或者低耦合的執行代碼顯式地分離,並將這些低耦合的執行代碼設計為相對獨立運行的執行緒,這種相對獨立運行的執行緒必須相互依賴和相互合作才能提供一套完善而又完整的接口、服務或系統,在此總結和介紹流水線模型、對等工作組模型、客戶端/伺服器模型、主從架構模型和其它模型等5種常見多執行緒編程模型。