Linux多執行緒程式設計之基礎篇

2021-06-25 07:25:02 字數 2641 閱讀 4656

1.多執行緒基礎

mutual exclusion lock(互斥鎖) 用來鎖定和解除鎖定對共享資料訪問的函式。

condition variable(條件變數) 用來阻塞執行緒直到狀態發生變化的函式。

read-write lock讀寫鎖-可用於對共享資料進行多次唯讀訪問的函式,但是要修改共享資料則必須以獨佔方式訪問。

counting semaphore(計數訊號量)一種基於記憶體的同步機制。

parallelism(並行性) 如果至少有兩個執行緒正在同時執行,則會出現此情況。

concurrency(併發性) 如果至少有兩個執行緒正在進行,則會出現此情況。併發是一種更廣義的並行性,其中可以包括分時這種形式的虛擬並行性。

2.結合執行緒和rpc(遠端過程呼叫)

通過將多個執行緒和乙個遠端過程呼叫(remote procedure call, rpc)結合起來,可以充分利用無共享記憶體的多處理器(如工作站集合)。這種結合將工作站集合視為乙個多處理器,從而使應用程式的分布變得相對容易些。例如,乙個執行緒可以建立多個子執行緒,每個子執行緒隨後可以請求遠端過程呼叫,從而呼叫另乙個工作站上的過程。儘管初始執行緒此時僅建立了一些並行執行的執行緒,但是這種並行性會涉及到其他計算機。

3、使用者級執行緒

執行緒是多執行緒程式設計中的主程式設計介面。執行緒僅在程序內部是可見的,程序內部的執行緒會共享諸如位址空間、開啟的檔案等所有程序資源。

使用者級執行緒狀態

以下狀態對於每個執行緒是唯一的。

■ 執行緒id

■ 暫存器狀態(包括pc和棧指標)

■ 棧■ 訊號掩碼

■ 優先順序

■ 執行緒專用儲存

4、執行緒排程

posix標準指定了三種排程策略:先入先出策略(sched_fifo)、迴圈策略(sched_rr)和自定義策略(sched_other)。sched_fifo是基於佇列的排程程式,對於每個優先順序都會使用不同的佇列。sched_rr與fifo相似,不同的是前者的每個執行緒都有乙個執行時間配額。

5、執行緒同步

使用同步功能,可以控制程式流並訪問共享資料,從而併發執行多個執行緒。共有四種同步模型:互斥鎖、讀寫鎖、條件變數和訊號。

互斥鎖僅允許每次使用乙個執行緒來執行特定的部分**或者訪問特定資料。

讀寫鎖允許對受保護的共享資源進行併發讀取和獨佔寫入。要修改資源,執行緒必須首先獲取互斥寫鎖。只有釋放所有的讀鎖之後,才允許使用互斥寫鎖。

條件變數會一直阻塞執行緒,直到特定的條件為真。

計數訊號量通常用來協調對資源的訪問。使用計數,可以限制訪問某個訊號的執行緒數量。達到指定的計數時,訊號將阻塞。

6、關於棧

通常,執行緒棧是從頁邊界開始的。任何指定的大小都被向上捨入到下乙個頁邊界。不具備

訪問許可權的頁將被附加到棧的溢位端。大多數棧溢位都會導致將sigsegv訊號傳送到違例線

程。將直接使用呼叫方分配的執行緒棧,而不進行修改。

指定棧時,還應使用pthread_create_joinable建立執行緒。在該執行緒的pthread_join(3c)調

用返回之前,不會釋放該棧。在該執行緒終止之前,不會釋放該執行緒的棧。了解這類執行緒是

否已終止的唯一可靠方式是使用pthread_join(3c)。

為執行緒分配棧空間

一般情況下,不需要為執行緒分配棧空間。系統會為每個執行緒的棧分配1mb(對於32位系

統)或2mb(對於64位系統)的虛擬記憶體,而不保留任何交換空間。系統將使用mmap()

的map_noreserve選項來進行分配。

系統建立的每個執行緒棧都具有紅色區域。系統通過將頁附加到棧的溢位端來建立紅色區

域,從而捕獲棧溢位。此類頁無效,而且會導致記憶體(訪問時)故障。紅色區域將被附加

到所有自動分配的棧,無論大小是由應用程式指定,還是使用預設大小。

注–對於庫呼叫和動態鏈結,執行時棧要求有所變化。應絕對確定,指定的棧滿足庫呼叫和

動態鏈結的執行時要求。

極少數情況下需要指定棧和/或棧大小。甚至專家也很難了解是否指定了正確的大小。甚至

符合abi標準的程式也不能靜態確定其棧大小。棧大小取決於執行中特定執行時環境的需

要。生成自己的棧

指定執行緒棧大小時,必須考慮被呼叫函式以及每個要呼叫的後續函式的分配需求。需要考

慮的因素應包括呼叫序列需求、區域性變數和資訊結構。

有時,您需要與預設棧略有不同的棧。典型的情況是,執行緒需要的棧大小大於預設棧大

小。而不太典型的情況是,預設大小太大。您可能正在使用不足的虛擬記憶體建立數千個線

程,進而處理數千個預設執行緒棧所需的數千兆位元組的棧空間。

對棧的最大大小的限制通常較為明顯,但對其最小大小的限制如何呢?必須存在足夠的棧

空間來處理推入棧的所有棧幀,及其區域性變數等。

屬性物件

要獲取對棧大小的絕對最小限制,請呼叫巨集pthread_stack_min。pthread_stack_min巨集將針

對執行null過程的執行緒返回所需的棧空間量。有用的執行緒所需的棧大小大於最小棧大小,

因此縮小棧大小時應非常謹慎。

多執行緒程式設計之基礎篇

1.windows為什麼支援執行緒?2.執行緒開銷 3.執行緒排程和執行緒優先順序 4.前台執行緒和後台執行緒 5.執行緒的hello world程式 早期的windows系統是沒有 執行緒 概念的,整個系統只能執行著乙個執行執行緒,這可能阻塞其他任務的執行,帶來極其差的使用者體驗,基於上述及其作業...

多執行緒程式設計 之 入門篇

自己第一次涉及c語言的多執行緒程式設計,實屬入門了解級別的 之前只做過j a的runnable的多執行緒程式設計。本次我們可以把螢幕看成是乙個資源,這個資源被兩個執行緒所共用,include include using namespace std dword winapi fun lpvoid lp...

linux多執行緒程式設計之互斥鎖

執行緒的同步問題 乙個程序中的多個執行緒是共享同一段資源的,由於執行緒對資源的競爭引出了鎖。其中mutex是一種簡單的加鎖方法,這個互斥鎖只有兩種狀態,那就是上鎖和解 鎖,可以把互斥鎖看作是某種意義上的全域性變數。在某一時刻,只能有乙個執行緒取得這個互斥上的鎖,擁有上鎖狀態的執行緒可以對共享資源進行...