Linux 多執行緒 pthread

2021-08-25 13:18:10 字數 3371 閱讀 7376

1. linux執行緒的發展

早在linux2.2核心中。並不存在真正意義上的執行緒,當時linux中常用的執行緒pthread實際上是通過程序來模擬的,也就是同過fork來建立「輕」程序,並且這種輕程序的執行緒也有個數的限制:最多只能有4096和此類執行緒同時執行。

2.4核心消除了個數上的限制,並且允許在系統執行中動態的調整程序數的上限,當時採用的是linux thread 執行緒庫,它對應的執行緒模型是「一對一」,而執行緒的管理是在核心為的函式庫中實現,這種執行緒得到了廣泛的應用。但是它不與posix相容。另外還有許多諸如訊號處理,程序id等方面的問題沒有完全解決。

相似新的2.6核心中,程序排程通過重新的編寫,刪除了以前版本中的效率不高的演算法,核心框架頁也被重新編寫。開始使用nptl(native posix thread library)執行緒庫,這個執行緒庫有以下幾個目標: posix相容,都處理結果和應用,底啟動開銷,低鏈結開銷,與linux thread應用的二進位制相容,軟硬體的可擴充套件能力,與c++整合等。 這一切是2.6的核心多執行緒機制更加完備。

2. linux 執行緒的實現

linux執行緒的基本操作

這裡主要講的執行緒以及相關操作都是使用者空間的執行緒操作,在linux中,一般pthread執行緒庫是一套通用的執行緒庫,是由posix提出的,因此具有很好的可移植性。

2.1 執行緒的建立: 建立執行緒通常使用的函式是pthread_create.

2.2 執行緒的退出:

2) 呼叫pthread_exit函式主動退出;

3) 程序終止函式exit函式,一旦結束了程序,那麼此程序中所有執行緒都將無條件終止。

乙個注意點:在預設執行緒屬性下,如果乙個程序有很多執行緒在同時執行,乙個執行緒在退出以後,當前執行緒所占用的資源並不會隨著執行緒的終止而得到釋放。因為所有處在乙個程序中的執行緒共享資源。

執行緒中還有乙個常用函式:pthread_join函式可以用於將當前執行緒掛起,等待其他執行緒結束。實際上,這個函式是就是乙個執行緒阻塞函式,呼叫它的函式將一直等待到被等待的執行緒結束為止。當函式返回時,被等待執行緒的資源就被**。

pthread_create 函式:

pthread_exit函式

pthread_join函式

取消乙個執行緒

有時候,我們想讓乙個執行緒 能夠請求另外乙個執行緒結束,就像給它傳送乙個訊號似的。用線程程是可以完成這一操作的,而與單處理經,執行緒在被要求結束執行的時候還有一種改變其行為的辦法。

我們來看看要求乙個執行緒結束執行的函式

這個定義很明白,給定乙個執行緒識別符號,我們就能要求取消它。但在取消線形程請求的接收端,事情會稍微複雜一些,好在也不是太複雜。線形程可以用pthread_setcancelstate設定自己的取消狀態,下面是這個函式的定義:

如果取消請求被接受了,執行緒會進入第二個控制層次----用pthread_setcanceltype設定取消型別。

稍微注意一點就是在android-ndk-r3 裡是不支援int pthread_cancel(pthread_t thread); 所以想強制退出執行緒似乎沒有更好的辦法。

linux多執行緒pthread的函式宣告在中,因此在使用該函式時,需要把該標頭檔案引入。

執行緒的建立

1、建立

int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(* func) (void *), void *restrict arg );

attr: 執行緒屬性包括:優先順序、初始棧大小,是否應該成為乙個守護執行緒。

預設設定,null

tidp是要建立的執行緒,建立成功後tipd為先執行緒的id

void *(* func) (void *)是乙個函式指標,該函式指標的型別為void* (*)(void *)

是乙個引數為void *,返回值也為void *的函式型別。它的乙個簡單的例子如下

void *thread_handler(void *arg)

return null;

void *restrict arg

中的arg是void *(* func) (void *)函式指標的引數。

補充:函式宣告中多次出現了restrict,其實這是用於cpu對函式的優化使用的,restrict的使用,由程式設計師保證使用restrict標誌的引數間不會有記憶體重疊。

獲取執行緒自身的id

pthread_t pthread_self(void);

等待給定執行緒終止

int pthread_join( pthread_t tid, void **status);

statues返回等待執行緒的返回值

單個執行緒有三種退出方式

1.執行緒從啟動例程中返回(return方式),返回值是現成的退出碼

2.執行緒被同一程序內的其他執行緒取消

3.執行緒呼叫pthread_exit退出。void pthread_exit(void *rval_ptr)

執行緒清理處理程式

void pthread_clean_push(void (*rtn)(void *),void *arg)

void pthread_clean_pop(iny excute)

清理函式rtn的呼叫順序是由pthread_clean_push函式安排的。

它在下列幾種情況下執行:

1.呼叫pthread_exit時

2.響應取消請求時

3.用非零execute引數呼叫pthread_clean_pop時

如果execute引數為0,清理函式將不被呼叫。無論何種情況,pthread_clean_pop都將刪除上次pthread_clean_push建立的清理處理程式。

如果執行緒使用return從例程返回,那麼pthread_clean_push建立的清理處理程式不會被執行。

linux thread與fork的對比

linux多執行緒pthread使用

linux多執行緒pthread使用 標頭檔案pthread.h pthread t pthid pthread create pthid,null,func,null 建立執行緒。pthread join pthid,null 等待該執行緒執行完畢後再退出,阻塞 執行緒掛起,不再占用cpu pth...

pthread 多執行緒

多執行緒程式指的是在同乙個程式中多個執行流併發執行,它們共享程序的同乙個位址空間,分別完成相應的任務,並通過共享位址空間等方式完成執行緒間通訊,cpu按照時間片輪轉等方式對執行緒進行切換和排程。通常而言,執行緒共享的程序資源包括 linux中線程的建立依賴於lpthread.so 庫,建立乙個thr...

Linux 多執行緒 pthread庫初探

linux 多執行緒 pthread庫用法 一 linux 執行緒有時候也叫light weight processlwp 輕量級執行緒,是程序的乙個執行流,有自己的執行棧,是作業系統排程的最小單位。多執行緒優勢在於切換開銷小,同程序內通訊方便,涉及io等阻塞性操作時可以單獨開乙個執行緒不阻塞主流程...