c 多執行緒學習總結

2021-09-03 02:00:18 字數 2769 閱讀 3933

一、建立執行緒

#include pthread_create (thread, attr, start_routine, arg)
建立執行緒成功時,函式返回 0,若返回值不為 0 則說明建立執行緒失敗。

引數描述

thread

指向執行緒識別符號指標。

attr

乙個不透明的屬性物件,可以被用來設定執行緒屬性。一般使用預設值 null。

start_routine

執行緒執行函式起始位址,一旦執行緒被建立就會執行。

arg執行函式的引數。它必須通過把引用作為指標強制轉換為 void 型別進行傳遞。如果沒有傳遞引數,則使用 null。

例如:

rc = pthread_create(&threads, null, printhello, (void *)&indexes);
二、執行緒終止
pthread_exit(status)
如果在main()的最後寫了pthread_exit(),那麼如果main函式在它所建立的執行緒之前結束,其他執行緒將繼續執行,不受main結束的影響。否則,它們將在main()結束時自動被終止。

三、阻塞等待乙個執行緒結束

函式pthread_join用來等待乙個執行緒的結束。函式原型為:

extern int pthread_join __p ((pthread_t __th, void**__thread_return));
第乙個引數為被等待的執行緒識別符號,第二個引數為乙個使用者定義的指標,它可以用來儲存被等待執行緒的返回值。這個函式是乙個執行緒阻塞的函式,呼叫它的函式將一直等待到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源被收回。

乙個執行緒不能被多個執行緒等待,也就是說對乙個執行緒只能呼叫一次pthread_join,否則只有乙個能正確返回,其他的將返回esrch錯誤。

四、多執行緒互斥鎖

互斥鎖常用的有四個函式,如下所示

#include int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); //初始化互斥鎖

int pthread_mutex_lock(pthread_mutex_t *mutex); //加鎖

int pthread_mutex_unlock(pthread_mutex_t *mutex); //解鎖

int pthread_mutex_destroy(pthread_mutex_t *mutex); //銷毀互斥鎖

互斥鎖的型別

ptread_mutex_t mutex;
linux下為了多執行緒同步,通常用到鎖的概念。

posix下抽象了乙個鎖型別的結構:ptread_mutex_t。通過對該結構的操作,來判斷資源是否可以訪問。顧名思義,加鎖(lock)後,別人就無法開啟,只有當鎖沒有關閉(unlock)的時候才能訪問資源。

在加鎖和解鎖的之間的**稱為臨界段**,只會由乙個執行緒來執行。互斥鎖通過確保一次只有乙個執行緒執行**的臨界段來同步多個執行緒。互斥鎖還可以保護單執行緒**。

4.1 互斥鎖初始化:

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

該函式用於c函式的多執行緒程式設計中,互斥鎖的初始化。函式成功完成之後會返回零,其他任何返回值都表示出現了錯誤。

pthread_mutex_init()函式是以動態方式建立互斥鎖的,引數attr指定了新建互斥鎖的屬性。如果引數attr為null,則使用預設的互斥鎖屬性,預設屬性為快速互斥鎖 。互斥鎖的屬性在建立鎖的時候指定,不同的鎖型別在試圖對乙個已經被鎖定的互斥鎖加鎖時表現不同。

4.2 互斥鎖屬性

互斥鎖的屬性在建立鎖的時候指定,在linuxthreads實現中僅有乙個鎖型別屬性,不同的鎖型別在試圖對乙個已經被鎖定的互斥鎖加鎖時表現不同。當前(glibc2.2.3,linuxthreads0.9)有四個值可供選擇:

4.3 其他鎖操作

鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖 pthread_mutex_trylock()三個,不論哪種型別的鎖,都不可能被兩個不同的執行緒同時得到,而必須等待解鎖。

對於普通鎖和適應鎖型別,解鎖者可以是同程序內任何執行緒;

檢錯鎖則必須由加鎖者解鎖才有效,否則返回eperm

對於巢狀鎖,文件和實現要求必須由加鎖者解鎖,但實驗結果表明並沒有這種限制,這個不同目前還沒有得到解釋。在同一程序中的執行緒,如果加鎖後沒有解鎖,則任何其他執行緒都無法再獲得鎖。

int pthread_mutex_lock(pthread_mutex_t *mutex)

int pthread_mutex_unlock(pthread_mutex_t *mutex)

int pthread_mutex_trylock(pthread_mutex_t *mutex)

pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經被佔據時返回ebusy而不是掛起等待。

4.4 死鎖:

死鎖主要發生在有多個依賴鎖存在時, 會在乙個執行緒試圖以與另乙個執行緒相反順序鎖住互斥量時發生. 如何避免死鎖是使用互斥量應該格外注意的東西。

總體來講, 有幾個不成文的基本原則:

C 多執行緒學習總結

thread類類位於system.threading命名空間中。建構函式public thread threadstart start public thread parameterizedthreadstart start public thread parameterizedthreadstar...

c 多執行緒總結

std thread比較好用,但是系統帶的socket不能呼叫recv handle h thread createthread null,0,fun,null,0,null 建立多執行緒 closehandle h thread 使用者介面執行緒經常過載該函式,工作者執行緒一般不使用 initin...

多執行緒學習總結(一) 認識多執行緒

而唯一看到的多執行緒 也是再專案中看到了別人寫的多執行緒 那時想要寫乙個和多執行緒相關的 基本是一模一樣的仿照著寫,出了一點問題也搞不懂問題在 所以就一直迷迷糊糊了一段時間,後來感覺有必要把這塊搞懂,就自己慢慢的找資料學習了。廢話就講這麼多,其實要學習多執行緒相關的,首先要搞清楚乙個概念,什麼是執行...