執行緒相關函式 執行緒退出 互斥鎖 訊號量 條件變數

2021-08-21 13:15:22 字數 3310 閱讀 8556

執行緒是cpu的最小排程單元,每個核上都可以執行乙個執行緒。

多程序缺點:

程序是互相隔離的,多程序之間的通訊和同步是效率低。

cpu進行程序切換效率低

建立乙個程序比建立執行緒耗費的記憶體多

優點:單核cpu可以完成多工,在巨集觀上並行。

執行緒:優點:

執行緒保留了多程序的多工特性,但是執行緒之間的通訊效率更高,切換執行緒的效率也更高。

多核的cpu可以保證多執行緒可以同時執行在多個核上(cpu不能保證多個程序可以同時執行在多核上)

使cpu利用率更高

執行緒就是在保留了程序的多工特性的基礎上,優化了程序的通訊和程序切換的效率。

執行緒建立與**

(1)pthread_create 用來創造子執行緒的 建立成功立刻呼叫一次

(2)pthread_join 用來等待(阻塞)**子執行緒

(3)pthread_detach 用來分離子執行緒,分離後主執行緒不必再去**子執行緒

(4)pthread_attr_init 屬性初始化的函式

執行緒取消

(1)pthread_cancel 一般都是主線程呼叫該函式去取消(讓它趕緊死)子執行緒

(2)pthread_setcancelstate 子執行緒設定自己是否允處理cancel訊號

(3)pthread_setcanceltype 取消模式(非同步取消《立刻死》 or 同步取消《等待適當時機死》)

執行緒函式退出相關

(1)pthread_exit與return退出

(2)pthread_cleanup_push 註冊乙個清理函式 清理鎖

(3)pthread_cleanup_pop 登出清理函式

執行緒私有資料

int pthread_key_creadte(pthread_key_t *key,void (*destr_fuction) (void *)); 建立鍵值

int pthread_setspecific(pthread_key_t key,const void * pointer)); 設定

void * pthread_getspecific(pthread_key_t key); 獲取

int pthread_key_delete(ptherad_key_t key); 刪除

主線程退出:

主線程中如果從main函式返回或是呼叫了exit函式退出主線程,則整個程序終止,此時所有的其他執行緒也將終

主線程呼叫pthread_exit函式,則僅僅是主線程消亡,程序不會結束

執行緒取消:

執行緒取消就是向目標執行緒傳送cancel訊號,但對這個訊號的處理方式由執行緒自身決定(取消)。

if 是否接受取消訊號 then

if 非同步取消 then

立刻結束

else

執行到下個取消點結束(多數阻塞函式的呼叫位置都是取消點 pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait())

endend

觸發終止執行緒的兩種方式:

正常終止 :return 和主動pthread_exit(),

非正常終止:外部干擾導致退出

無論是那種方式退出 執行緒的資源都會被釋放

對於非正常終止 要保證退出前資源可以正確清理 使用 pthread_cleanup_push/pthread_cleanup_pop。在兩個函式中間的終止操作會呼叫清理函式,清理資源(如釋放鎖)

終止後清理資源方式:

執行緒為分離狀態:作業系統自動**資源。

pthread_join() :其他程序阻塞等待執行緒結束 並釋放資源

其他:當執行緒退出時,執行緒占用的資源並不會釋放。

什麼是執行緒同步???

執行緒同步就是控制線程的執行順序,保證執行緒安全(多個執行緒訪問同時訪問同乙個資料)

同步方式:

互斥鎖:

pthread_mutex_init pthread_mutex_destroy

pthread_mutex_lock pthread_mutex_unlock

訊號量:

int sem_init 

int sem_wait(sem_t *sem); 給訊號量減1;對乙個值為0的訊號量呼叫sem_wait,這個函式將會等待直到有其它執行緒使它不再是0為止。

int sem_post(sem_t *sem); 給訊號量的值加1;

int sem_destroy

條件變數

pthread_cond_init pthread_cond_destroy

pthread_cond_wait pthread_cond_signal/pthread_cond_broadcast

互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。乙個執行緒等待"條件變數的條件成立"而掛起;另乙個執行緒使"條件成立"(給出條件成立訊號)。

多執行緒為什麼需要同步??

為了解決多執行緒間共享資料問題,如果資料只是讀那麼沒有影響。

為什麼共享資料會發生問題???

對共享資料的操作如果不是原子不可打斷的(單個彙編指令完成的操作為原子 或 加鎖),那麼在執行過程中線程可能會被掛起,其他執行緒也可以執行操作這個資料,就會導致執行緒見資料不安全。

例子:x++和++x。

其實類似x++, x+=2, ++x這樣的操作在多執行緒環境下是需要同步的。因為x86會按三條指令的形式來處理這種語句:從記憶體中讀x的值到暫存器中,對暫存器加1,再把新值寫回x 所處的記憶體位址。

例如有兩個執行緒,它們按照如下順序執行(注意讀x和寫回x是原子操作,兩個執行緒不能同時執行):

time thread 1 thread 2

0 load eax, x

1 load eax x

2 add eax, 1 add eax, 1

3 store x, eax

4 store x, eax

中斷的位置對程式的輸出結果是有影響的,這就是導致多執行緒問題的根本原因。所以引入執行緒同步解決,保證某部分資料或**的操作是原子的。

同步、互斥區別??

互斥不要求執行緒按一定順序執行,同步是為了讓執行緒按一定順序執行。

同步是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。可以說同步是特殊的互斥。

互斥鎖與訊號量:

互斥鎖是一種特殊的訊號量,值只能是0 1 ,訊號量值 可以是任意非0整數。互斥鎖的加鎖和解鎖操作必須在同一執行緒中,訊號量可以乙個執行緒釋放,另乙個執行緒得到。

條件變數:條件變數用於同步 阻塞的等待某一條件滿足 互斥鎖是爭奪資源 用於互斥

為什麼要和互斥鎖一起使用???

執行緒 互斥鎖

include include include include include 1.靜態初始化,當動態初始化時,遮蔽靜態初始化 pthread mutex t mutex pthread mutex initializer 2.動態初始化 pthread mutex t mutex int lock...

執行緒互斥鎖

執行緒互斥鎖 降低效率,保證資料安全 執行緒 資料共享 修改共享資料,資料不安全 from threading import thread,lock import time n 100 deftask global n temp n time.sleep 0.1 n temp 1 if name m...

執行緒互斥與同步 互斥鎖與訊號量

所謂互斥,就是不同執行緒通過競爭進入臨界區 共享的資料和硬體資源 為了防止訪問衝突,在有限的時間內只允許其中之一獨占性的使用共享資源。如不允許同時寫 同步關係則是多個執行緒彼此合作,通過一定的邏輯關係來共同完成乙個任務。一般來說,同步關係中往往包含互斥,同時對臨界區的資源會按照某種邏輯順序進行訪問。...