C 學習 多執行緒

2021-06-14 21:17:13 字數 2314 閱讀 7348

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 多執行緒 學習

什麼是程序?當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資 源。而乙個程序又是由多個執行緒所組成的。什麼是執行緒?執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區 是共享的,即不同的執行緒可以執行同樣的函式。什麼是多執...