Linux執行緒更多細節

2021-10-06 12:57:01 字數 1706 閱讀 6518

以下內容引述至《linux/unix系統程式設計手冊》

建立執行緒時,每個執行緒都有乙個屬於自己的執行緒棧,且大小固定,除主線程外的所有執行緒,其棧的預設大小均為2mb,也可以呼叫pthread_attr_setstack()設定執行緒屬性決定執行緒站的大小。

unix訊號模型是基於unix程序模型而設計的,問世比pthread要早幾十年。所以訊號與執行緒模型之間存在一些明顯的衝突。主要是因為一方面,針對單執行緒程序要保持傳統的訊號語義,於此同時,又需要開發出使用與多執行緒程序環境的新訊號模型。

要了解unix訊號如何對映到pthreads模型,就需要了解,訊號模型的那些方面屬於程序層面(由程序中的所有執行緒所共享),那些方面是屬於程序中的單個執行緒層面。

剛建立的新執行緒從其建立者處整合訊號掩碼的乙份拷貝,執行緒使用pthread_sigmask來改變並獲取當前的訊號掩碼

#include

intpthread_sigmask

(int how,

const sigset_t* set, sigset_t *oldset)

;

除了所操作的執行緒訊號掩碼之外,pthread_sigmask與sigprocmask的用法完全相同。

函式pthread_kill()向同一程序下的另一線程傳送訊號sig

#include

intpthread_kill

(pthread_t thread,

int sig)

;#define _gnu_source

#include

intpthread_sigqueue

(pthread_t thread,

int sig,

const

union si**al value)

;

使用pthread_sigqueue向同一程序中的另一線程傳送攜帶資料的訊號

沒有任何pthread api屬於非同步訊號安全函式,均無法在訊號處理函式中安全加以呼叫。所以當多執行緒應用程式必須處理非同步產生的訊號時,通常不應該將訊號處理函式作為接收訊號到達的通知機制。推薦的方法如下:

與訊號機制類似,exec()、fork()和exit()的問世均早於pthread api,接下來的段落將指出在多執行緒程式中的使用此類系統呼叫所應關注的細節

只要任一線程呼叫了exec()系列函式之一時,呼叫程式將被完全替換。除了呼叫exec()的執行緒之外,其他所有的執行緒都將立即消失。沒有任何執行緒會針對執行緒特有資料執行結構函式,也不會呼叫清理函式。該程序的所有互斥量和屬於程序的條件變數都會消失。

當多執行緒程序呼叫fork()時,金會將發起呼叫的執行緒複製到子程序中。其他執行緒均在子執行緒中消失,也不會為這些執行緒呼叫清理函式以及針對執行緒特有資料的結構函式。將引起如下問題

任何執行緒呼叫了exit,或者主線程執行了return,所有執行緒都將消失,也不會執行執行緒特有資料的結構函式以及清理函式。

在m:1執行緒視線中,關乎執行緒建立,排程以及同步的所有細節全部由程序內使用者空間的執行緒庫來處理

每個執行緒對映乙個單獨的kse,核心分別對每個執行緒做排程處理,執行緒同步操作通過核心系統呼叫實現。

m:n實現旨在結合1:1和m:1模型的優點

每個程序都有多個與之相關的kse,並且也可以把多個執行緒對映到乙個kse。這種設計允許核心將同一應用的執行緒排程到不同的cpu上執行,同時也解決了隨執行緒數量而放大的效能問題。

兩種實現

其中nptl採用1:1模型設計,始於linux 2.6

多執行緒細節解析

在學習完多執行緒後,分析一下一下兩種方法建立4個執行緒的不同之處!建立執行緒方法1 public static void main 建立執行緒方法2 public static void main 方法1和方法2都是建立了4個執行緒,類mythread實現了runnable介面 方法1是用for迴圈...

多執行緒程式設計細節

多執行緒程式設計細節 thread類 thread類實現了runnable介面,所以thread物件也是可執行runnable物件,同時thread類也是執行緒類 構造器常見方法 runnable介面 runnable介面只定義了乙個方法public void run 這個方法要求實現runnabl...

多執行緒細節講解

一般run方法執行完,執行緒應該正常結束,但是常常有些執行緒是伺服執行緒 即只有獲得某種訊號,才會停止的執行緒 最常見的就是在while迴圈當中的執行緒,設定乙個boolean型別的標誌,來退出迴圈。之所以使用volatile關鍵字,是為了是exit同步。執行緒處於阻塞狀態,呼叫interrupt方...