執行緒是競爭系統資源的最小單位。程序是執行緒的容器,乙個程序可以包含多條執行緒,同乙個程序的所有執行緒共用這個程序的記憶體空間。建立乙個新程序則會拷貝乙個新的記憶體空間。與程序相比,執行緒是一種更加節儉的的多工處理方式,但是程式的健壯性執行緒就沒有程序強。
1.建立乙個執行緒 pthread_create(pthread_t thread, const pthread_attr_tattr,void *(*start_routine) (void *), void *arg);
執行緒之間的需要訪問一些共享資源,為了保證對共享資源的有序訪問,防止競爭,需要對共享資源進行某種方式的保護,使得共享資源有序訪問。
步驟:1.先確定共享資源
2.確定臨界區
3.在使用保護機制去保護
執行緒中有哪些常見的共享資源嗎?
任何的全域性變數,任何的malloc的記憶體…都可以是共享資源,所有的執行緒都可以訪問.
.執行緒互斥鎖
執行緒互斥鎖是存在於程序位址空間內部的一種保護機制,「類似於訊號量」,只不過存在於程序內部的位址空間(預設)
在posix多執行緒中,使用型別pthread_mutex_t來描述乙個執行緒互斥鎖
操作方法非常類似於「無名訊號量」
步驟:1.定義乙個執行緒互斥鎖
2.初始化執行緒互斥鎖
3.p/v操作
4.銷毀執行緒互斥鎖
初始化乙個指定的執行緒互斥鎖:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
mutex:要初始化的執行緒互斥鎖的位址
attr:執行緒互斥鎖的屬性,一般建議寫null,表示使用預設屬性
返回值:
成功返回0
失敗返回非0,errno被設定
例:pthread_mutex_t mutex;//定義乙個鎖
pthread_mutex_init(&mutex,null);
銷毀乙個指定的執行緒互斥鎖。
int pthread_mutex_destroy(pthread_mutex_t *mutex);
mutex:你要銷毀的執行緒互斥鎖
銷毀並不是刪除,只是把鎖的值變成未定義的!!
pthread_mutex_lock p操作
int pthread_mutex_lock(pthread_mutex_t *mutex);
pthread_mutex_unlock v操作
pthread_mutex_trylock:是嘗試獲取mutex指向的執行緒互斥鎖,「非阻塞版本」
生產者-消費者模型
生產者負責 產生 資料(任務)
消費者負責 消耗 資料(任務)
存在的問題:
1.儲存資料/任務的緩衝區是乙個共享資源
「互斥問題」
訊號量/執行緒互斥鎖
2.當緩衝區沒有資料的時候,消費者執行緒怎麼辦? 同步問題
a.不停的測試,看是否有任務來了 ----->輪詢
浪費cpu
b.使用類似於「訊號」的模式
當緩衝區沒有資料的時候,讓出cpu(執行緒/程序休眠),當有資料產生的時候
在喚醒(生產者)我,再通知(生產者)我
-------->執行緒的條件變數
在程式設計中,到底是要多執行緒還是多程序呢?
在需要進行資料共享比較多的時候,執行緒佔優勢
可靠性和耦合性性來說,多程序佔優勢
建立速度來說,程序建立/銷毀/切換速度慢,執行緒建立/銷毀/切換速度快,
從占用的資源來說,程序占用的記憶體多,cpu利用率比較低,執行緒占用的記憶體少,切換方便,
Python 多執行緒複習
python 多執行緒4種方式同步 1,lock。最簡單的用法,對於乙個全域性變數,要修改或者讀取前都記得lock.acquire下。然後用完就release下就好。缺點 無法通知某個執行緒去執行,需要不停的詢問查,是否可以獲得鎖了。2,訊號量 就是乙個計數器,他不i能 0,當 0時,則等待其他的執...
Java基礎複習執行緒
執行緒 實現多執行緒的兩種方法 繼承thread類,重新run方法 thread a new mythread 子執行緒 thread.start 實現runnable介面,實現run方法。myrunnable my new myrunable 在這個myrunnable類中已經重寫了run方法 t...
linux 複習大綱(執行緒)
執行緒 英語 thread 是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務 1 首先是定義程序 是執行中一段程式,即一旦程式被載入到記憶體中並準備執行,它就是乙個...