程序——資源分配的最小單位,執行緒——程式執行的最小單位。

執行緒是程序的一個執行流,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位。

一個程序由幾個執行緒組成(擁有很多相對獨立的執行流的使用者程式共享應用程式的大部分資料結構),執行緒與同屬一個程序的其他的執行緒共享程序所擁有的全部資源。

程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。

執行緒有自己的堆疊和區域性變數,但執行緒沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

為什麼使用多執行緒?

與程序相比,它更加節約資源,不需要分配地址空間。運行於一個程序中的多個執行緒,它們之間使用相同的地址空間,而且執行緒間彼此切換所需的時間也遠遠小於程序間切換所需要的時間;

執行緒間方便的通訊機制。對不同程序來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過程序間通訊的方式進行,這種方式不僅費時,而且很不方便。執行緒則不然,由於同一程序下的執行緒之間共享資料空間,所以一個執行緒的資料可以直接為其它執行緒所用,這不僅快捷,而且方便;

建立執行緒

#include <pthread.h>
int pthread_create(pthread_t * tidp,const pthread_attr_t*attr,void*(*start_rtn)(void),void*arg)
tidp:執行緒id
attr: 執行緒屬性(通常為空)
start_rtn:執行緒要執行的函式

arg:執行函式需要的的引數

退出執行緒

int pthread_join(pthread_t tid,void **rval_ptr)

如果程序中任何一個執行緒中呼叫exit或_exit,那麼整個程序都會終止。執行緒的正常退出方式有:
(1) 執行緒從啟動例程中返回
(2) 執行緒可以被另一個執行緒終止

(3) 執行緒自己呼叫pthread_exit函式

#include <pthread.h>
   void pthread_exit(void * rval_ptr)//

執行緒等待

void *status;
pthread_join(pthread_t tid, &status);//阻塞呼叫程序,直到指定的執行緒終止

取消執行緒

Pthread_cancel(pthread_t tid);//取消指定執行緒號的執行緒

獲取自己的執行緒號

pthread-self();//返回該程序的程序號 pthread_t tid;

當多個執行緒同時訪問同一個共享資源時,由執行緒1處理過的節點再由執行緒2來處理時,萬一節點被釋放,那後果就會很糟糕!為了防止這個現象,可以引入互斥量這一概念。

執行緒在取出頭節點前必須要等待互斥量,如果此時有其他執行緒已經獲得該互斥量,那麼該執行緒將會阻塞在這裡.只有等到其他執行緒釋放掉該互斥量後,該執行緒才有可能得到該互斥量。互斥量從本質上說就是一把鎖, 提供對共享資源的保護訪問。

建立互斥量

pthread_t mutex;
pthread_mutex_init(&mutex, NULL);//初始化互斥量

對共享資源的訪問, 要使用互斥量進行加鎖, 如果互斥量已經上了鎖, 呼叫執行緒會阻塞, 直到互斥量被解鎖。

pthread_mutex_lock(&mutex);//加鎖
pthread_mutex_unlock(&mutex);//上鎖

在操作完成後,必須給互斥量解鎖,也就是前面所說的釋放。這樣其他等待該鎖的執行緒才有機會獲得該鎖,否則其他執行緒將會永遠阻塞。

釋放互斥量

pthread_mutex_destroy(&mutex);//釋放互斥量