1.1線程的概念
線程-隸屬于進程伦糯,是進程中的程序流
在操作系統(tǒng)中支持多進程的,而每個進程的內(nèi)部支持多個線程喂击,多個線程并行
進程是重量級單位载慈,每個進程都需要獨立的內(nèi)存空間等資源珍手,新建進程對于資源的消耗比較大琳要,線程是輕量級的,不需要申請獨立的內(nèi)存等資源稚补,但是每個線程也有一個獨立的棧區(qū)课幕,線程實際上更多的是共享進程中的資源
1.2 線程的相關函數(shù)
1)pthread_create函數(shù)
pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void*),void *arg);
第一個參數(shù):用于存放線程id
第二個參數(shù):線程的屬性,直接給0即可
第三個參數(shù):線程所調(diào)用的函數(shù)
第四個參數(shù):給線程調(diào)用函數(shù)傳遞的實參
返回值:成功返回0杜秸,失敗返回錯誤編號
函數(shù)功能:用于創(chuàng)建一個新的線程
注意:1)在編譯鏈接時需要加選項 -lpthread
2)但程序結束時润绎,所有子線程都結束了
創(chuàng)建出來的線程與主線程具有同等的優(yōu)先級,不一定誰先執(zhí)行
2)pthread_join函數(shù)
int pthread_join(pthread,void **retval);
第一個參數(shù):指定所要等待的線程id
第二個參數(shù):用于接受所等待線程的退出碼返回值:成功返回0呢蛤,失敗返回錯誤編號函數(shù)功能:等待thread所指向的線程結束
3)pthread_self函數(shù)#includepthread_tpthread_self(void);功能:獲取正在執(zhí)行的線程id棍郎,返回值就是線程的id
4)pthread_exit函數(shù)#includevoid pthread_exit(void *retval);
參數(shù):用于返回一個數(shù)據(jù)
功能:終止正在調(diào)用的線程
exit函數(shù)涂佃,用于終止一個進程
1.3線程的狀態(tài)線程有兩種狀態(tài)
1)非分離狀態(tài) pthread_join對于非分離狀態(tài)的線程來說,線程資源的回收需要等到join函數(shù)結束之后
2)分離狀態(tài) pthread_detach對于分離狀態(tài)的線程來說抚笔,線程結束后資源馬上回收侨拦,無法使用pthread_join函數(shù)等待的
3)pthread_detach函數(shù)
int pthread_detach(pthread_t thread);
參數(shù):線程id
返回值:成功返回0,失敗返回錯誤編號
功能:用于分離線程
2.線程
2.1線程的取消1)pthread_cancel函數(shù)
int pthread_cancel(pthread_t thread);
參數(shù):要取消的線程id
回值:成功返回0膨蛮,失敗返回錯誤編號
功能:對thread指向的線程發(fā)送取消的請求
2)pthread_setcancelstate函數(shù)
int pthread_setcancelstate(int state,int *oldstate);
第一個參數(shù):設置取消狀態(tài)
第一個參數(shù):設置取消狀態(tài)
PTHREAD_CANCEL_ENABLE 可以被取消
PTHREAD_CANCEL_DISABLE 不可以被取消
第二個參數(shù):帶出原來的取消狀態(tài)
返回值:成功返回0;失敗返回錯誤編號
函數(shù)功能:設置線程是否允許被取消
3)pthread_setcanceltype函數(shù)
int pthread_setcanceltype(int type,int *oldtype);
第一個參數(shù):設置新的類型
PTHREAD_CANCEL_DEFERRED 推到下一個取消點 取消
PTHREAD_CANCEL_ASYNCHRONOUS 立即取消
第二個參數(shù):帶出原來的取消類型
返回值:成功返回0誉察;失敗返回錯誤編號
函數(shù)功能:設置線程何時被取消
2.2 線程的同步
1)概念:
多線程之間共享進程的資源惹谐,多個線程同時訪問相同的資源時氨肌,需要相互協(xié)調(diào),以防止出現(xiàn)數(shù)據(jù)的不一致和不完整的問題怎囚,線程之間的協(xié)調(diào)和通信 叫做 線程的同步
2)線程同步的思路
訪問共享資源時恳守,不能并行,而是創(chuàng)新
3)線程同步的解決方案
在線程中催烘,提供了互斥量(互斥鎖)實現(xiàn)線程同步
4)使用互斥量實現(xiàn)線程同步的步驟
a 定義互斥量
pthread_mutex_t lock;
b 初始化互斥量
pthread_mutex_init(&lock,0);
c 使用互斥量進行加鎖
pthread_mutex_lock(&lock);
d 使用共享資源
e 使用互斥量進行解鎖
pthread_mutex_unlock(&lock)
f 銷毀互斥量
pthread_mutex_destroy(&lock)
5)使用信號量實現(xiàn)線程的同步
信號量 --就是一個計數(shù)器颗圣,用于控制同時訪問共享資源的進程/線程數(shù),如果信號量的值是1奔则,等同于互斥量
使用信號量實現(xiàn)線程同步的流程
a 定義信號量
sem_t sem;
b 初始化信號量
sem_init(&sem,o/*控制線程*/,最大值/*個數(shù)*/);
c 獲取一個信號量(相當于計數(shù)器減1)
sem_wait(&sem);
d 訪問共享資源
e 釋放一個信號量(相當于計數(shù)器加1)
sem_post(&sem)
f 銷毀信號量
sem_destory(&sem)
6)條件變量 以及 生產(chǎn)者-消費者模型 DMS項目