概念
執行緒:執行緒是程式中的一個執行流,每個執行緒都有自己的專有暫存器(棧指針、程式計數器等),但代碼區是共享的,即不同的執行緒可以執行同樣的函式。
多執行緒:多執行緒是指程式中包含多個執行流,即在一個程式中可以同時運行多個不同的執行緒來執行不同的任務,也就是說允許單個程式創建多個並行執行的執行緒來完成各自的任務。
C語言的開始設計,並未設計多執行緒的機制,由於隨著軟硬體的發展及需求的發展。後來C語言才開發了執行緒庫以支持多執行緒的操作、套用。
主要基於Linux介紹C多執行緒。在編譯C的多執行緒時候,一方面必須指定Linux C語言執行緒庫多執行緒庫pthread,才可以正確編譯(例如:gcc test.c -o test -lpthread);另一方面要包含有關執行緒頭檔案#include <pthread.h>。
優勢
執行緒程式作為一種多任務、並發的工作方式,當然有其存在優勢:
提高應用程式回響:
這對圖形界面的程式尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程式不會回響鍵盤、滑鼠、選單的操作,而使用多執行緒技術,將耗時長的操作(time consuming)置於一個新的執行緒,可以避免這種尷尬的情況。
使多CPU系統更加有效:
作業系統會保證當執行緒數不大於CPU數目時,不同的執行緒運行於不同的CPU上。
改善程式結構:
一個既長又複雜的進程可以考慮分為多個執行緒,成為幾個獨立或半獨立的運行部分,這樣的程式會利於理解和修改。
操作步驟
執行緒創建
函式原型:intpthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立執行緒返回0,否則返回錯誤的編號。
形式參數:pthread_t*restrict tidp要創建的執行緒的執行緒id指針;const pthread_attr_t *restrict attr創建執行緒時的執行緒屬性;void *(start_rtn)(void)返回值是void類型的指針函式;void *restrict arg start_rtn的形參。
執行緒掛起:該函式的作用使得當前執行緒掛起,等待另一個執行緒返回才繼續執行。也就是說當程式運行到這個地方時,程式會先停止,然後等執行緒id為thread的這個執行緒返回,然後程式才會斷續執行。
函式原型:intpthread_join(pthread_tthread, void **value_ptr);
參數說明如下:thread等待退出執行緒的執行緒號;value_ptr退出執行緒的返回值。
返回值:若成功,則返回0;若失敗,則返回錯誤號。
執行緒退出
函式原型:voidpthread_exit(void *rval_ptr);
獲取當前執行緒id
函式原型:pthread_tpthread_self(void);
互斥鎖
創建pthread_mutex_init;銷毀pthread_mutex_destroy;加鎖pthread_mutex_lock;解鎖pthread_mutex_unlock。
條件鎖
創建pthread_cond_init;銷毀pthread_cond_destroy;觸發pthread_cond_signal;廣播pthread_cond_broadcast;等待pthread_cond_wait。