linux執行緒詳解 一

2021-06-20 13:46:11 字數 3036 閱讀 5819

在沒有執行緒的情況下,程序是程式執行流的最小單位,程式的執行可以被分割成很多程序來實現,但對於有些細微的過程,如果組織乙個程序來執行,會比較浪費資源,因為,我

們都知道每個程序的建立都是要開闢整塊的程序空間,**段,資料段,堆,棧等,而執行緒就是乙個很好的選擇,執行緒有如下有點:

執行緒間的共享資料比程序間共享簡單的多

執行緒的建立更加快速

執行緒使用占用更少的資源

但執行緒也有自己的缺點:

使用執行緒程式設計,我們必須確認自己的執行緒安全(多執行緒常常因為不當的共享資料訪問而出問題)

乙個執行緒中的bug很可能使所有執行緒都掛掉

多個執行緒需要競爭其所在程序位址空間

乙個程序可以有多個執行緒,它們雖然分開執行,但是它們共享全域性變數,包括:初始資料,未初始資料,堆,但每個執行緒都有自己單獨的棧(呼叫函式必須用到)

執行緒的記憶體分配圖

在linux中,errno被設定為乙個全域性的整型,很明顯對於執行緒這種方法並不適用,因為多個執行緒會競爭使用errno,而結果就是errno中儲存的錯誤值未必能夠對應到出現錯誤的執行緒。所以在linux將errno設定為一系列可以根據返回值區分執行緒的巨集函式。

和普通函式不同,執行緒函式返回0代表成功,負數代表失敗

#include

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start)(void *), void *arg);

thread指向乙個pthread_t型別的buf,其中存放著執行緒的識別符號,start指向執行緒的呼叫函式,arg是傳給呼叫函式的引數,attr指向乙個設定執行緒的屬性結構體

執行緒的結束方式:

執行緒函式返回

執行緒呼叫pthread_eixt()

執行緒通過pthread_cancel()被取消

任何執行緒呼叫exit(),或者主線程return,都會讓所有執行緒結束

include

void pthread_exit(void *retval);

include

pthread_t pthread_self(void);

每個執行緒通過其id被唯一標識,這個id可以通過pthread_self()函式活得

include

int pthread_equal(pthread_t t1, pthread_t t2);

pthread_equal函式可以被用來檢測兩個兩個執行緒id是否相同

include

int pthread_join(pthread_t thread, void **retval);

pthread_join函式可以用來等待指定id執行緒結束,如果該執行緒已經結束,則該函式立馬返回,如果retval為非空指標,那麼它將複製乙份執行緒函式的返回值

預設情況下,每個執行緒都是可以被等待結束的,有些情況下我們不需要關注乙個執行緒的返回狀態,只想在它結束之後立馬收回資源,這個時候我們可以隔離(detach)該執行緒

#include

int pthread_detach(pthread_t thread);

乙個執行緒被隔離之後,便無法被等待結束,而且一旦被隔離,便無法被恢復

執行緒測試**,這段**根據使用者輸入引數個數為建立執行緒個數,對應為執行緒名

多執行緒詳解(一)

執行緒是cpu排程和執行的單位。main函式是主線程。繼承thread類的建立方式 建立執行緒方式一 繼承thread類,重寫run 方法,呼叫start 開啟執行緒 public class test01 extends thread public static void main string ...

Linux 執行緒同步(一)

執行緒為什麼要同步 1.共享資源,多個執行緒可以對共享資源操作 2.由於併發原因,執行緒操作共享資源操作順序不一樣,可能會造成髒資料 3.處理器對儲存器的操作一般不是原子操作。臨界區 critical section 臨界區為了保證在某一時刻只有乙個執行緒能訪問資料的簡便方法,在任意時刻只允許乙個執...

linux多執行緒(一)

多程序是資源管控的最小單位那麼多執行緒是資源排程的最小單位,多程序就像乙個大廈有著所有資源那麼多執行緒就是大廈中的那些辦公室呼叫大廈的資源來進行工作。linux提供了關於執行緒建立,控制,設定屬性的api.多執行緒控制代碼資料型別 pthread t thread 建立執行緒並且指定執行函式 int...