溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux多線程函數解析

發(fā)布時間:2021-09-13 17:33:20 來源:億速云 閱讀:136 作者:chen 欄目:編程語言

這篇文章主要介紹“Linux多線程函數解析”,在日常操作中,相信很多人在Linux多線程函數解析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux多線程函數解析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Linux 多線程函數解析

Linux多線程函數用得比較多的是下面的3個
pthread_create(),pthread_exit(),pthread_join(); 它們都是在頭文件之中。編譯時需要加靜態(tài)庫-lpthread

下面是函數的說明:pthread_create是UNIX環(huán)境創(chuàng)建線程函數
int pthread_create(
pthread_t *restrict tidp,
const pthread_attr_t *restrict_attr,
void*(*start_rtn)(void*),
void *restrict arg);

返回值
  若成功則返回0,否則返回出錯編號
  返回成功時,由tidp指向的內存單元被設置為新創(chuàng)建線程的線程ID。attr參數用于制定各種不同的線程屬性。新創(chuàng)建的線程從start_rtn函數的地址開始運行,該函數只有一個萬能指針參數arg,如果需要向start_rtn函數傳遞的參數不止一個,那么需要把這些參數放到一個結構中,然后把這個結構的地址作為arg的參數傳入。
  linux下用C開發(fā)多線程程序,Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pthread。
  由 restrict 修飾的指針是最初唯一對指針所指向的對象進行存取的方法,僅當第二個指針基于第一個時,才能對對象進行存取。對對象的存取都限定于基于由 restrict 修飾的指針表達式中。 由 restrict 修飾的指針主要用于函數形參,或指向由 malloc() 分配的內存空間。restrict 數據類型不改變程序的語義。 編譯器能通過作出 restrict 修飾的指針是存取對象的唯一方法的假設,更好地優(yōu)化某些類型的例程。
參數
  第一個參數為指向線程標識符的指針。
  第二個參數用來設置線程屬性。
  第三個參數是線程運行函數的起始地址。
  最后一個參數是運行函數的參數。
另外,在編譯時注意加上-lpthread參數,以調用靜態(tài)鏈接庫。因為pthread并非Linux系統(tǒng)的默認庫

pthread_exit(void* retval);
線程通過調用pthread_exit函數終止自身執(zhí)行,就如同進程在結束時調用exit函數一樣。這個函數的作用是,終止調用它的線程并返回一個指向某個對象的指針。該指針可以通過pthread_join(pthread_t tpid, void **value_ptr)中的第二個參數value_ptr獲取到。

函數pthread_join用來等待一個線程的結束。函數原型為:
  extern int pthread_join __P (pthread_t __th, void **__thread_return);
第一個參數為被等待的線程標識符,第二個參數為一個用戶定義的指針,它可以用來存儲被等待線程退出時的返回值。這個函數是一個線程阻塞的函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。如果執(zhí)行成功,將返回0,如果失敗則返回一個錯誤號。
所有線程都有一個線程號,也就是Thread ID。其類型為pthread_t。通過調用pthread_self()函數可以獲得自身的線程號。

下面是一個簡單的例子,子線程thread_fun會打出5次“this is thread_fun print!”然后調用pthread_exit退出,并返回一個指向字符串“this is thread return value!”的指針。在主函數里面調用pthread_join等待thread_fun線程結束,然后讀取子線程的返回值到value中,再打印出來。
輸出結果是:
pthread_create ok!
this is thread_fun print!
this is thread_fun print!
this is thread_fun print!
this is thread_fun print!
this is thread_fun print!
pthread exit value: this is thread return value!

01.#include
02.#include
03.#include
04.#include
05.#include
06.#include
07.//////////////////////////////////////////////////////
08.void *thread_fun(void *arg) {
09. int i=0;
10. char *value_ptr = "this is thread return value!\n";
11. for (i=0; i<5; i++) {
12. printf("this is thread_fun print!\n");
13. sleep(1);
14. }
15. pthread_exit((void*)value_ptr);
16.}
17.//////////////////////////////////////////////////////
18.int main(int argc, char **argv) {
19. pthread_t pid;
20. int ret;
21. void* value;
22.
23. ret = pthread_create(&pid, NULL, thread_fun, NULL);
24. if (ret) {
25. printf("pthread_create failed!\nerrno:%d\n", errno);
26. return -1;
27. }
28. printf("pthread_create ok!\n");
29.
30. pthread_join(pid, &value);
31. printf("pthread exit value: %s\n", value);
32. return 0;
33.}
34.

到此,關于“Linux多線程函數解析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI