Linux之多執行緒

2021-10-06 20:35:04 字數 3019 閱讀 3502

二、執行緒控制

三、執行緒安全

(1)多執行緒優點:

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

執行緒的切換排程成本更低。(程序間切換時不僅僅要切換程序pcb資訊,還有頁表之類的。)

(2)多執行緒缺點:

① 執行緒將自己的入口函式執行完畢後return退出,(main中return退出的是程序)

② 執行緒可以呼叫pthread_exit終止自己。

③ 乙個執行緒可以呼叫pthread_cancel終止同乙個程序中的另乙個執行緒。

函式原型

含義void pthread_exit(void* retval);

終止執行緒(呼叫者自身)

int pthread_cancel(pthread_t tid);

取消乙個同乙個程序中的指定的執行中的執行緒。

函式原型

含義int pthread_join(pthread_t thread, void** retval);

等待執行緒結束

函式原型

含義int pthread_detach(pthread_t tid);

表示分離指定的執行緒。

pthread_t pthread_self(void);

表示獲取呼叫執行緒的tid。

pthread_detach(pthread__self())

表示執行緒分離自己。

(1)概念:多個執行流(執行緒,乙個執行緒就是乙個執行流)對同乙個臨界資源進行爭搶訪問,但是不會造成資料的二義性。

(2)實現:

(1)互斥鎖:

函式原型

含義pthread_mutex_t

互斥鎖變數型別

pthread_mutex_init(pthread_mutex_t* mutex, pthread_mutex_t* attr);

互斥鎖初始化(第乙個引數為互斥鎖變數,第二個引數一般置空)

pthread_mutex_lock(pthread_mutex_t* mutex);

互斥鎖加鎖

pthread_mutex_unlock(pthread_mutex_t* mutex);

互斥鎖解鎖

pthread_mutex_destroy(pthread_mutex_t* mutex);

互斥鎖銷毀

(2)死鎖:

(3)死鎖的預防

(4)死鎖的避免

函式原型

含義pthread_cond_t

條件變數型別

pthread_cond_init(pthread_cond_t* cond, pthread_cond_t* attr);

條件變數初始化(第乙個引數為條件變數,第二個引數為屬性一般置空。)

pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);

訪問條件不滿足時,讓乙個執行緒一直阻塞。

pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, struct timespec );

訪問條件不滿足時,限時阻塞等待。等待指定時間內都沒有喚醒則自動醒來。

pthread_cond_signal(pthread_cond_t* cond);

通過條件變數喚醒等待佇列上等待的執行緒。

pthread_cond_broadcast(pthread_cond_t* cond);

喚醒所有等待的執行緒。

pthread_cond_destroy(pthread_cond_t* cond);

銷毀條件變數。

函式原型

介面sem_t

定義訊號量。

int sem_init(sen_t* sem, int pshared, usigned int value);

訊號量的初始化(第乙個引數是訊號量變數;第二個引數pshared決定了當前的訊號量用於程序間還是執行緒間,0是執行緒間,!0是程序間;第三個引數是訊號量的初值,初始資源數量有多少計數就是多少。)

int sem_wait(sem_t* sem);

通過自身計數判斷是否滿足條件,不滿足則直接一直阻塞程序/執行緒。條件判斷加等待。若計數<=0,則減一後阻塞,若計數》0則減一後立即返回。

int sem_trywait(sem_t* sem);

通過字舍計數判斷是否滿足條件,不滿足則立即報錯返回,不阻塞、

int sem_timedwait(sem_t* sem, const strutct timespec* abs timeout);

不滿足則等地啊指定時間,超時後報錯返回etimedout。

int sem_post(sem_t* sem);

通過訊號鏈喚醒自己阻塞佇列上的pcb,計數加1喚醒訊號量等待佇列上的執行緒。

int sem_destroy(sem_t* sem);

銷毀訊號量。

(1)餓漢模式,所有資源載入或者物件的例項化都放在程式的初始化階段,接下來在各個執行緒中直接使用。(優點:資源提前弄好了,執行時效能會比較高。整體執行比較流暢、但是所有資源載入都放在初始化階段到記憶體中了,將當前不用的資源也載入到記憶體中,資源消耗比較大,初始化耗時比較長,一般用於程式後台的批處理程式)

class

test

private

:static

int data;};

int test::data;

(2)懶漢模式,)資源並不在程式初始化階段全部載入/初始化,而是等到使用的時候才去判斷來載入/初始化。(優點:初始化比較快,若不釋放的話執行階段使用的時候也只需載入一次即可。)

class

test

}private

:static

int* pdata;};

int test::pdata =

nullptr

;

linux之多執行緒

linux系統下的多執行緒遵循posix執行緒介面,稱為pthread 標頭檔案 include 原型 int pthread create pthread t tidp,const pthread attr t attr,void start rtn void void arg 返回值 若執行緒建...

Linux 之多執行緒程式設計基礎

多執行緒程式設計時有以下幾點需要特別關注 建立執行緒時,僅僅申請執行緒自身的棧空間,與同程序的其他執行緒共享其他位址空間,包括 段 資料段 堆等。核心仍然把執行緒當做乙個程序進行處理的,只不過不再分配記憶體而已 程序是作業系統管理資源的基本單元,執行緒時linux系統排程的基本單元 1 建立執行緒 ...

Boost之多執行緒

c 標準庫沒有涉及執行緒,在c 中,雖然不可能寫出標準相容的多執行緒程式,程式設計師可以使用特定作業系統提供的執行緒庫來寫出多執行緒程式來。可是,這至 少導致兩個突出的問題 作業系統普遍提供的是c庫,在c 中使用要更小心,每個作業系統都有自己的一套支援多執行緒的庫 另外,不標準,不可移植。boost...