1.1線程的概念
線程-隸屬于進程,是進程中的程序流
在操作系統中支持多進程的,而每個進程的內部支持多個線程,多個線程并行
進程是重量級單位,每個進程都需要獨立的內存空間等資源,新建進程對于資源的消耗比較大,線程是輕量級的,不需要申請獨立的內存等資源,但是每個線程也有一個獨立的棧區,線程實際上更多的是共享進程中的資源
1.2 線程的相關函數
1)pthread_create函數
pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void*),void *arg);
第一個參數:用于存放線程id
第二個參數:線程的屬性,直接給0即可
第三個參數:線程所調用的函數
第四個參數:給線程調用函數傳遞的實參
返回值:成功返回0,失敗返回錯誤編號
函數功能:用于創建一個新的線程
注意:1)在編譯鏈接時需要加選項 -lpthread
2)但程序結束時,所有子線程都結束了
創建出來的線程與主線程具有同等的優先級,不一定誰先執行
2)pthread_join函數
int pthread_join(pthread,void **retval);
第一個參數:指定所要等待的線程id
第二個參數:用于接受所等待線程的退出碼返回值:成功返回0,失敗返回錯誤編號函數功能:等待thread所指向的線程結束
3)pthread_self函數#includepthread_tpthread_self(void);功能:獲取正在執行的線程id,返回值就是線程的id
4)pthread_exit函數#includevoid pthread_exit(void *retval);
參數:用于返回一個數據
功能:終止正在調用的線程
exit函數,用于終止一個進程
1.3線程的狀態線程有兩種狀態
1)非分離狀態 pthread_join對于非分離狀態的線程來說,線程資源的回收需要等到join函數結束之后
2)分離狀態 pthread_detach對于分離狀態的線程來說,線程結束后資源馬上回收,無法使用pthread_join函數等待的
3)pthread_detach函數
int pthread_detach(pthread_t thread);
參數:線程id
返回值:成功返回0,失敗返回錯誤編號
功能:用于分離線程
2.線程
2.1線程的取消1)pthread_cancel函數
int pthread_cancel(pthread_t thread);
參數:要取消的線程id
回值:成功返回0,失敗返回錯誤編號
功能:對thread指向的線程發送取消的請求
2)pthread_setcancelstate函數
int pthread_setcancelstate(int state,int *oldstate);
第一個參數:設置取消狀態
第一個參數:設置取消狀態
PTHREAD_CANCEL_ENABLE 可以被取消
PTHREAD_CANCEL_DISABLE 不可以被取消
第二個參數:帶出原來的取消狀態
返回值:成功返回0;失敗返回錯誤編號
函數功能:設置線程是否允許被取消
3)pthread_setcanceltype函數
int pthread_setcanceltype(int type,int *oldtype);
第一個參數:設置新的類型
PTHREAD_CANCEL_DEFERRED 推到下一個取消點 取消
PTHREAD_CANCEL_ASYNCHRONOUS 立即取消
第二個參數:帶出原來的取消類型
返回值:成功返回0;失敗返回錯誤編號
函數功能:設置線程何時被取消
2.2 線程的同步
1)概念:
多線程之間共享進程的資源,多個線程同時訪問相同的資源時,需要相互協調,以防止出現數據的不一致和不完整的問題,線程之間的協調和通信 叫做 線程的同步
2)線程同步的思路
訪問共享資源時,不能并行,而是創新
3)線程同步的解決方案
在線程中,提供了互斥量(互斥鎖)實現線程同步
4)使用互斥量實現線程同步的步驟
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)使用信號量實現線程的同步
信號量 --就是一個計數器,用于控制同時訪問共享資源的進程/線程數,如果信號量的值是1,等同于互斥量
使用信號量實現線程同步的流程
a 定義信號量
sem_t sem;
b 初始化信號量
sem_init(&sem,o/*控制線程*/,最大值/*個數*/);
c 獲取一個信號量(相當于計數器減1)
sem_wait(&sem);
d 訪問共享資源
e 釋放一個信號量(相當于計數器加1)
sem_post(&sem)
f 銷毀信號量
sem_destory(&sem)
6)條件變量 以及 生產者-消費者模型 DMS項目