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