linux 執行緒使用

2021-08-08 22:40:20 字數 2837 閱讀 3268

一、概念

執行緒是程序內部的一條執行序列,乙個程序內部至少有一條執行執行緒。 即就是 main函式的執行體。 程序內部可以有多條執行緒, main 函式的執行緒稱之為主線程, 其他執行緒稱之為函式執行緒。 函式執行緒是由主線程通過系統呼叫函式建立的。執行緒可以同時執行。

二、執行緒與程序的區別

(1)執行緒是輕量級的程序, 程序是資源分配的最小單位, 執行緒是排程執行的最小單位。

(2)實體間(程序間,執行緒間)通訊方式的不同

(3)執行緒之間的切換需要作業系統做的工作要比程序之間的切換少得多,因此多個執行緒對資源的需求要遠小於多個程序。

三、執行緒分類

(1)使用者級: 在使用者空間是多執行緒的, 核心只識別程序整體。 執行緒建立、 管理、 銷毀都是由使用者空間負責, 使用者通過呼叫庫函式在完成。

(2) 核心級: 執行緒的建立、 控制、 銷毀都是由核心實現的, 每個執行緒對核心都是可見的。

(3)組合模型: 一部分是使用者級, 一部分核心級執行緒。 介於核心級和使用者級之間, 使用者態建立多個執行緒, 核心看到的也是多個, 只是這是種 m: n 的對應關係。

四、執行緒的建立

#include < pthread.h >

int pthread_create(pthread_t * id , pthread_attr_t * attr , void * (* pthread_fun)(void *), void *arg);

作用:建立乙個新執行緒,類似於建立新程序的fork函式。

返回值:若成功則返回0,否則返回錯誤編號。

引數解釋:

id :執行緒被建立時,這個指標指向的變數中將被寫入乙個標誌符,用該標誌符來引用新執行緒。

attr: 設定執行緒屬性,一般設定該引數為null。

pthread_fun: 執行緒建立以後所呼叫的函式位址。

arg: 傳遞給函式執行緒的引數。

總結:五、執行緒終止

如果程序中的任一線程呼叫了exit,_exit或者_exit,那麼整個程序就會終止。與此類似,如果訊號的預設動作是終止程序,那麼,把該訊號傳送到執行緒會終止整個程序。

單個執行緒可以通過下列三種方式退出,在不終止整個程序的情況下停止它的控制流。

(1)從啟動例程中返回,返回值是執行緒的退出碼

(2)執行緒可以被同一程序中的其他執行緒取消

(3)執行緒呼叫pthread_exit()

#include< pthread.h >

void pthread_exit(void *rval_ptr);

作用:主線程結束, 函式執行緒還在執行 。

引數解釋:

rval_ptr是乙個無型別指標, 指向執行緒的返回值儲存變數。程序中的其他執行緒可以通過呼叫 pthread_join函式訪問到這個指標。

#include< pthread.h >

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

作用: 獲取指定執行緒由 pthread_exit 設定的退出資訊。

返回值: 成功則返回0, 否則返回錯誤編號。

引數解釋:

thread: 執行緒id。

rval_ptr: 指向返回值的指標(返回值也是個指標)。

說明:

主線程建立兩個函式執行緒, 第乙個負責列印 100 以內的所有的素數, 第二個實現選擇排序。 主線程睡眠 100 秒。
#include< stdio.h>

#include< stdlib.h>

#include< assert.h>

#include< string.h>

#include< unistd.h>

#include< pthread.h>

void *pthread_fun1(void *arg)

}if(j>=i)

}printf("\n");

}void *pthread_fun2(void *arg)

; int len=sizeof(arr)/sizeof(arr[0]);

printf("對陣列元素進行排序\n");

六、函式執行緒傳遞引數i. 傳值

將變數的值強轉成 void* , 函式執行緒中, 對 arg 的值強轉成變數的型別。

ii. 傳位址

將變數的位址強轉成 void*, 函式執行緒中, 對 arg 的值強轉成變數型別的指標,再去取值。

七、執行緒間的資料共享

全域性變數:共享

棧區資料 :不共享

堆區:共享

檔案: 共享(同乙個程序的執行緒, 使用乙個 pcb, 只要執行緒能拿到開啟

的檔案的檔案描述符, 就可以通過檔案描述符操作檔案。)

Linux 執行緒屬性的使用

執行緒屬性 執行緒具有屬性,用 pthread attr t 表示,在對該結構進行處理之前必須進行初始化,在使用後需要對其去除初始化。我們用 pthread attr init 函式對其初始化,用 pthread attr destroy 對其去除初始化。名稱 pthread attr init p...

在Linux中使用執行緒

我並不假定你會使用linux的執行緒,所以在這裡就簡單的介紹一下。如果你之前有過多執行緒方面的程式設計經驗,完全可以忽略本文的內容,因為它非常的初級。首先說明一下,在linux編寫多執行緒程式需要包含標頭檔案pthread.h。也就是說你在任何採用多執行緒設計的程式中都會看到類似這樣的 1 incl...

linux多執行緒的使用

include include class infoprinted void show const private char c int n void printinfo void info int main 第一次學習多執行緒程式設計。注意多執行緒函式返回值和引數均為啞型指標void 若要傳多個資...