c++/c本身並沒有多執行緒的內容,需要使用pthread庫, include,編譯+ -lpthread, pthread是乙個posix標準,在不同平台上有不同實現,這裡以linux pthread庫為準.
參考一,執行緒的建立
1,使用pythread_create函式,原型如下
int pthread_create(
pthread_t
* thread,const pthread_attr_t * attr, void*(*start_routine)(void*), void *restrict args);
引數 thread: pthread_t 型別的指標,相當於乙個執行緒id
attr: 執行緒屬性 pthread_attr_t型別,一般可以填null
start_routine: 執行緒入口函式, 必須返回void* 且有乙個 void* 型別的引數
args 傳給入口函式的引數, void*型別
2,如果要傳入多個引數,可以用乙個struct把引數包起來,傳給入口函式,再用型別轉換轉成struct
3,如果想知道自己的執行緒號可以用pthread_self()
二線程的join和detach
1, join的含義是呼叫join的執行緒會一直block直到被join執行緒結束, 執行緒需要有joinable屬性才能被join,否則就是detach的, 顯然這麼做的原因是join需要一定的開銷.
2,join函式;int
pthread_join
(pthread_t thread, void **retval);
引數 thread是被join執行緒的id, retval可以用來接收執行緒退出時傳來的資訊
3, 可以通過pthread_create的第二個引數設定執行緒屬性成joinable或detach, 不過執行緒預設就是joinable的, 所以一般不需要去設定
4, 如果你想把乙個執行緒射程detach, 直接用void pthread_detach(pthread_t thread)
三,執行緒的退出
1,除了主線程, 所有執行緒都是平等的, 可以在任意執行緒中cancel掉其他執行緒
2,如果沒有join 主線程是不會等待其他執行緒結束的, 如果主線程提前退出,其他執行緒還沒結束,一般是會出core的
3,非自然退出執行緒一般有兩種方式: 自己pthread_exit 或被pthread_cancel掉:
void pthread_exit(void* retval);
這個函式有乙個void*型別返回值, 你可以返回乙個字串,並通過pthread_join 的第二個引數看到
void* run(void*)
int main()
int pthread_cancel(pthread_t thread)
這個函式是你可以在乙個執行緒中使另乙個執行緒退出, 當然前提是你得知道它的執行緒號
四,鎖mutex
1, 使用乙個鎖,一般來說你需要
a)用pthread_mutex_t 定義乙個鎖
b)用pthread_mutex_init ()把它初始化,事實上你把這部省略也可以正常工作(相當於靜態宣告mutex), 不過最好明確init一下
c)pthread_lock() 上鎖
d)pthread_unlock()解鎖
e)pthread_mutex_destory()銷毀,當然也可以省略, 畢竟一把鎖也沒佔多少資源
2,給乙個已經上鎖的mutex上鎖會block住直到mutex解鎖
3,posix規定以下情況是邏輯錯誤,實際上什麼也不會發生, 當然最好避免
a)給沒有上鎖的mutex解鎖
b)給不屬於你的mutex解鎖
五,條件 cond
1,使用條件可以採用非輪詢的方式監控一件事情,使用方式如下:
a) 執行緒a呼叫int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) block住,等待條件達成
b)執行緒b判斷條件已達成, 呼叫pthread_cond_signal 喚醒block的a
2,注意pthread_cond_wait的第二個引數是乙個鎖,實際上發生了如下事情:
a) unlock mutex 如果mutex沒有鎖住, 不起任何作用
b)block the thread
c)receive signal
d)lock mutex 注意! 如果此時mutex被鎖住(例如pthread_cond_signal後立刻lock)是不會繼續進行的, 這可能不是你希望的, 你要確保此時mutex不會被鎖住或者乾脆給cond一把單獨的鎖.
C 多執行緒學習
什麼是程序?當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。什麼是執行緒?執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式。什麼是多執行緒...
C 多執行緒學習
這篇部落格主要是解決乙個問題。c 建立執行緒 互斥量 c 多執行緒庫原始碼分析 c 訊號量實現 用到的標頭檔案 include 執行緒 include 互斥量 include 非同步操作 include 條件變數 可能用到的命名空間 using namespace this thread 使用thr...
C 多執行緒 學習
什麼是程序?當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資 源。而乙個程序又是由多個執行緒所組成的。什麼是執行緒?執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區 是共享的,即不同的執行緒可以執行同樣的函式。什麼是多執...