Linux程式設計之執行緒介紹

2021-07-24 04:53:28 字數 2237 閱讀 7643

首先來看下程序和執行緒的關係,執行緒是程序中的乙個單一控制流,它是作業系統運算排程的最小單位,即執行緒是執行的最小單位,程序是最小的分配資源單位。在linux下,有時候我們又稱執行緒為輕量級程序,因為程序和執行緒它們的底層實現都是由乙個叫做clone的函式來實現的。這個clone函式是比較底層的,它可以轉殖一切可寫的東西,例如:堆,棧,非唯讀資料段等等。在核心層面來看,程序和執行緒是一樣的,它們共享同一片記憶體位址空間。

執行緒之間非共享資源有:執行緒id、棧(核心棧空間和使用者棧空間)、errno變數、訊號遮蔽字、排程優先順序等。

執行緒有哪些優缺點呢?

優點:1.提高程式的併發性;2.開銷小,不用重新分配記憶體;3.通訊和共享資料方便

缺點:1.執行緒不穩定;2.執行緒除錯比較困難;3.執行緒無法使用unix經典事件,例如:訊號(也不是說不能用,最好不要混用,要不然很麻煩)

linux的執行緒是通過pthread_create函式來建立的,其宣告如下:

int pthread_create(

pthread_t *thread, //傳出引數,儲存新執行緒的執行緒id

const pthread_attr_t *attr, //執行緒屬性,一般為null

void *(*start_routine)(void *), //執行緒函式指標

void *arg //執行緒函式引數

);

該函式執行成功返回0,失敗返回錯誤碼,請注意這裡失敗不是返回-1,因為很多linux系統函式一般都是失敗返回-1,errno被設定。雖然每個執行緒都有自己的errno,但是pthread庫並不使用它,它只是為了相容其它介面實現的。

當使用該函式來建立執行緒的時候,需要包含pthread.h標頭檔案,而且在編譯的時候我們需要新增-lpthread這一句。

要想獲取乙個執行緒的id,可以通過pthread_self函式來獲得,其宣告如下:

pthread_t pthread_self();
該函式返回執行緒的id,pthread_t在linux下被定義成unsigned long型別。

程序退出可以使用exit函式,那麼執行緒退出可以使用pthread_exit函式,其宣告如下:

void pthread_exit(

void *retval

);

int pthread_join(

pthread_t thread, //執行緒的id

void **value_ptr //接收退出執行緒傳遞出的返回值

);

該函式獲取指定執行緒的退出值,並釋放指定執行緒的資源,若指定執行緒沒有退出,則該函式將阻塞,直至執行緒退出才返回。該函式呼叫成功返回0,失敗返回錯誤碼。指定執行緒以不同的方式退出,儲存的值是不同的:

1.如果指定執行緒是正常退出返回的,則value_ptr儲存的是執行緒函式的退出值

2.如果指定執行緒是被另乙個執行緒呼叫pthread_cancel終止的,則value_ptr儲存的是常數pthread_canceled

3.如果指定執行緒自己呼叫pthread_exit終止的,則value_ptr儲存的是pthread_exit內的引數

4.如果我們對指定執行緒的退出狀態不感興趣,可以傳null給value_ptr

有時需要在乙個執行緒內終止另外乙個執行緒,此時可以呼叫pthread_cancel,其宣告如下:

int pthread_cancel(

pthread_t thread

);

被終止的執行緒的退出值是pthread_canceled,該值在pthread庫中被定義成-1。當執行緒間呼叫pthread_cancel的時候,系統並不會馬上關閉被取消的執行緒,而是要等到下次系統呼叫(使用者空間切換)的時候,系統才會去真正的關閉執行緒。

當乙個執行緒退出後,如果沒有沒pthread_join,那麼會發生什麼事呢?此時,該執行緒的資源沒有被**,變成了殭屍執行緒。有時候,可能並不關心執行緒的退出值,又不想去**它,那麼可以在開始的時候將這個執行緒設定分離態,當執行緒被設定成分離態後,就不需要再去pthread_join了,執行緒退出後,系統會自動**執行緒資源。至於如何設定執行緒分離態,可以呼叫pthread_detach,其宣告如下:

int pthread_detach(

pthread_t tid //要設定的執行緒id

);

當乙個執行緒成分離態後,就不能用pthread_join來進行**了,若呼叫pthread_join函式,此時會呼叫失敗。

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

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

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

1.多執行緒基礎 mutual exclusion lock 互斥鎖 用來鎖定和解除鎖定對共享資料訪問的函式。condition variable 條件變數 用來阻塞執行緒直到狀態發生變化的函式。read write lock讀寫鎖 可用於對共享資料進行多次唯讀訪問的函式,但是要修改共享資料則必須以...

Linux網路程式設計之多執行緒

多執行緒模型 在多執行緒模型下,注意共享資料的同步,mutex condition variable rw lock等的使用,local thread storage的使用,另外,可以搭配執行緒池處理非同步計算任務。在c 11中的執行緒庫中已經提供了future相關的工具,合理地使用執行緒模型減少資...