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