linux多執行緒學習筆記五 執行緒安全

2021-06-06 02:02:05 字數 1047 閱讀 2522

一,執行緒安全基礎

乙個函式被稱為執行緒安全的當且僅當被多個併發執行緒反覆呼叫時,它會一直產生正確的結果。我們能夠定義出四類執行緒不安全函式。

第一類:不保護共享變數的函式

共享變數在多執行緒中是共享資料,可以通過同步機制來保護共享資料。

第二類:保護跨越多個呼叫狀態的函式

乙個偽隨機數生成器是乙個簡單的例子:

unsigned int next=1;

int rand(void)

void srand(unsigned int seed)

rand函式是執行緒不安全的,因為當前呼叫的結果依賴於前次呼叫的中間結果。

第三類:返回指向靜態變數的指標的函式

某些函式(如gethostbyname)將計算結果放在靜態結構中,並返回乙個指向這個結構的指標。在多執行緒中乙個執行緒呼叫的結構可能被另乙個執行緒覆蓋。可以通過重寫函式和加鎖拷貝技術來消除。加鎖拷貝技術指在每個位置對互斥鎖加鎖,呼叫執行緒不安全函式,動態的為結果分配儲存器,拷貝函式返回的結構,然後解鎖。

第四類:呼叫執行緒不安全函式

常見的系統執行緒不安全函式:

執行緒不安全函式

執行緒不安全 類

unix執行緒安全版本

rand

2rand_r

strtok

2strtok_r

asctime

3asctime_r

ctime

3ctime_r

gethostbyaddr

3gethostbyaddr_r

geyhostbyname

3gethostbyname_r

inet_ntoa

3localtime

3localtime_r

二、可重入性

有一類重要的執行緒安全函式,叫做可重入函式,其特點:當它們被多個執行緒呼叫時,不會引用任何共享資料。可重入、執行緒安全函式之間的關係如下圖。

Java多執行緒學習筆記(五)執行緒池

一 執行緒池的基本類 executors 執行緒池工廠,通過 executors 可以取得乙個擁有特定功能的執行緒池。threadpoolexecutor 執行緒池,實現了executor 介面,因此通過這個介面,任何 runnable物件都可以被 threadpoolexecutor執行緒池排程。...

多執行緒(五) 執行緒的通訊

例題 使用兩個執行緒列印1 100。執行緒1,執行緒2交替列印。執行緒通訊的例子 使用兩個執行緒列印1 100.執行緒1,執行緒2,交替列印。class number implements runnable catch interruptedexception e system.out.printl...

LINUX執行緒(五)執行緒同步

執行緒同步,指乙個執行緒發出同一功能呼叫時,在沒有得到結果之前,該呼叫不返回。同時其他執行緒為保證資料一致性,不能呼叫該功能 鎖的使用 建議鎖,對公共資料進行保護,所有執行緒應該在訪問公共資料前先拿鎖再訪問,但鎖本身不具備強制性 pthread mutex t mutex phtread mutex...