「走進計算機深處」 Linux 執行緒(一)

2021-10-04 05:27:14 字數 3468 閱讀 4285

競爭條件:多個執行流競爭執行

函式的可重入和不可重入:

函式的重入:多個執行流同時進入乙個函式執行**

可重入:函式重入不會造成資料二義,或者邏輯混亂

不可重入:函式重入可能造成資料二義,或者邏輯混亂

關鍵點:是否對全域性資料進行非原子安全操作(原子操作指不可被打斷)

sigghld訊號:子程序退出後作業系統給父程序傳送通知資訊 。這個訊號預設處理方式,就是什麼都不做,因此子程序退出後在不等待的情況下會成為殭屍程序,這個訊號是乙個非可靠訊號,意味著有大量紫禁城同時退出的時候,可能會出現資料丟失。

執行緒概念

linux下的執行緒是乙個輕量級程序通過程序pcb描述實現的,並且同乙個執行緒組中的執行緒共用同一塊虛擬位址空間,因此linux下的pcb相較於傳統pcb更加輕量化。

執行緒是cpu排程的基本單位/程序是系統資源分配的基本單位

多程序/多執行緒 優缺點:

多執行緒優點:

1.執行緒間通訊更加方便靈活

2.執行緒的建立與銷毀成本更低

3.執行緒間的排程切換成本更低

缺點:1.執行緒間缺乏訪問控制,一些異常和系統呼叫對整個程序生效。

多程序:

穩定性和健壯性更高,適用於主程序安全性更高的場景(shell/伺服器)

多程序和多執行緒進行任務處理的優勢在**?

1.io密集型程式(在程式中大量進行io操作)(io操作:io等待+資料拷貝)

2.cpu密集型程式(在程式中不斷進行資料運算)

執行緒建立:作業系統並沒有給使用者直接提供建立乙個執行緒的介面,因此使用執行緒庫(posix執行緒庫)來進行執行緒控制,所以叫使用者態執行緒。

建立執行緒

錯誤檢查:

傳統的一些函式是,成功返回0,失敗返回-

1,並且對全域性變數errno賦值以指示錯誤。

pthreads函式出錯時不會設定全域性變數errno(而大部分其他posix函式會這樣做)。而是將錯誤**

通過返回值返回

功能:建立乙個新的執行緒

原型 int

pthread_create

(pthread_t *thread,

const pthread_attr_t *attr,

void*(

*start_routine)

(void*)

,void

*arg);引數

thread:返回執行緒id

attr:設定執行緒的屬性,attr為null表示使用預設屬性

start_routine:是個函式位址,執行緒啟動後要執行的函式

arg:傳給執行緒啟動函式的引數

返回值:成功返回0;失敗返回錯誤碼

pthreads同樣也提供了執行緒內的errno變數,以支援其它使用errno的**。對於pthreads函式的錯

誤,建議通過返回值業判定,因為讀取返回值要比讀取執行緒內的errno變數的開銷更小

執行截圖:

執行緒終止

前提:執行緒退出也不會完全釋放資源,需要被其他執行緒的等待

概念:等待乙個指定執行緒退出,獲取這個退出執行緒的返回值並**資源

功能:等待執行緒結束

原型 int

pthread_join

(pthread_t thread,

void

**value_ptr);引數

thread:執行緒id

value_ptr:它指向乙個指標,後者指向執行緒的返回值

返回值:成功返回0;失敗返回錯誤碼

#include

#include

#include

#include

#include

void

*thread1

(void

*arg )

void

*thread2

(void

*arg )

void

*thread3

(void

*arg )

return

null;}

intmain

(void

)執行結果:

[root@localhost linux]# .

/a.out

thread 1 returning ...

thread return

, thread id 5aa79700,

return code:

1 thread 2 exiting ...

thread return

, thread id 5aa79700,

return code:

2

執行緒分離:預設情況下,新建立的執行緒是joinable的,執行緒退出後,需要對其進行pthread_join(等待)操作,否則無法釋

放資源,從而造成系統洩漏。

被分離後處於detach屬性的執行緒退出後,則會自動釋放資源(無法被等待)

可以是執行緒組內其他執行緒對目標執行緒進行分離,也可以是執行緒自己分離:

joinable和分離是衝突的,乙個執行緒不能既是joinable又是分離的。

#include

#include

#include

#include

#include

void

*thread_run

(void

* arg )

intmain

(void

)int ret =0;

sleep(1

);//很重要,要讓執行緒先分離,再等待if(

pthread_join

(tid,

null)==

0)else

return ret;

}

「走進計算機深處」 Linux 執行緒(三)

前言 執行緒 二 主要學習了執行緒安全管理,同步與互斥的作用,明白了互斥鎖和等待佇列的使用場景和方法,這篇部落格主要闡述其發生場景,生產者與消費者模型。模型如下 模型優點 1.支援忙閒不均 2.支援併發 3.解耦合 讓兩個模組產生更小的關聯性 模型關係分析 生產者與生產者應該具備互斥關係 消費者與消...

「走進計算機深處」 Linux 程序(一)

什麼是程序?程序是為了提高cpu的執行效率,減少因為程式等待帶來的cpu空轉以及其他計算機硬體資源浪費而提出的。描述程序 pcb 程序資訊被放在乙個叫做程序控制塊的資料結構中,可以理解為程序屬性的集合。課本上稱之為pcb process control block linux作業系統下pcb是tas...

大話儲存 1 走進計算機IO世界

組成計算機的三大件 cpu,記憶體和io。匯流排就是一條或者多條物理上的導線,每個部件都接到這些導線上,同一時刻只能有乙個部件在接收或者傳送。仲裁匯流排 所有部件按照另一條匯流排,也就是仲裁匯流排或者中斷匯流排上給出的訊號來判斷這個時刻匯流排可以由哪個部件來使用。產生仲裁匯流排或者中斷電位的可以是c...