多線程
1.進程與線程的區別:
1)進程是程序的一次執行,是資源分配的最小單位,線程可以理解爲進程中執行的一段程序片段,是CPU調度的最小單位;
2)進程間是獨立的,一個程序崩潰後,在保護模式下不會對其他進程產生影響。同一進程所產生的線程共享同一內存空間,一個線程掛掉會導致整個進程掛掉;
3)同一進程中兩段代碼不能同時執行,除非引入線程;、線程所佔用的資源要少於進程所佔用資源;
4)進程間可以通過IPC通信,但線程不可以。
2.多進程與多線程的區別:
3.線程與進程相比的優點?
1)和進程相比,多線程是一種非常“節儉”的多任務操作方式。在Linux系統下,啓動一個新的進程必須分配給它的獨立的地址空間,建立衆多的數據表來維護它的代碼段、堆棧段和數據段,這是一種“昂貴”的多任務工作方式
運行於一個進程中的多個線程,它們之間使用相同的地址空間,而且線程間彼此切換所需的時間也遠遠小於進程間切換所需要的時間.據統計,一個進程的開銷大約是一個線程開銷的30倍左右
2)線程間方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過進程間通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由於同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接爲其它線程所用,這不僅快捷,而且方便
3)使多CPU系統更加有效.操作系統會保證當線程數不大於CPU數目時,不同的線程運行於不同的CPU上.
4)改善程序結構.一個既長又複雜的進程可以考慮分爲多個線程,成爲幾個獨立或半獨立的運行部分,這樣的程序會利於理解和修改.
4.線程的操作
創建線程
等待線程結束
退出線程
(1)pthread_create
函數的作用:創建一個線程
函數的原型:int pthread_create(pthread_t * thread,const pthread_attr_t *attr,(void*)(*start_rtn)(void),void *arg)
函數的參數:thread:線程的標識符
attr:線程的屬性,一般設爲NULL
start_rtn:線程的執行函數
arg:傳入到線程執行函數的參數
返回值:成功:0 出錯 < 0
(2)pthread_exit
函數的作用:終止調用線程
函數的原型:void pthread_exit(void * retval)
(3)pthread_join
函數的作用:阻塞調用線程,直到指定的線程終止
函數的原型:int pthread_join(pthread_t th,void ** thread_return)
函數的參數:th:線程的標識符
thread_return:不爲NULL時,存儲線程結束時返回值
5.解決線程間對資源競爭的方法:
(1)互斥量Mutex
(2)信號燈Semaphore
(3)條件變量Conditions
6.線程的互斥
(1)互斥鎖初始化
(2)獲取互斥鎖
(3)釋放互斥鎖
(1)pthread_mutex_init
函數的作用:初始化互斥鎖
函數的原型:int pthread_mutex_init(pthread_mutex_t * mutex,const pthread_mutexaddr *attr)
函數的參數:mutex:互斥鎖
返回值:成功:0,出錯:-1
(2)pthread_mutex_lock、pthread_mutex_trylock、pthread_mutex_unlock、pthread_mutex_destorylock
函數的作用:對互斥鎖上鎖,判斷上鎖,解除鎖,破壞鎖
函數的原型:int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_destorylock(pthread_mutex_t *mutex)
返回值:成功:0,出錯:-1
7.PV操作
(1)sem_init
函數的作用:初始化信號量
函數的原型:int sem_init(sem_t *sem,int pshared,unsigned int value)
函數的參數:sem:信號量指針
pshared:0
value:信號量的初始值
返回值:成功0,出錯:-1
頭文件:#include <semphore.h>
(2)信號量的PV操作,銷燬
函數的原型:int sem_wait(sem_t *sem) ——P
int sem_trywait(sem_t *sem)
int sem_post(sem_t *sem) ——V
int sem_getvalue(sem_t *sem)
int sem_destroy(sem_t *sem)
函數的參數:sem:信號量指針
函數的返回值:成功 0,出錯 -1