一、進程和線程的區別
進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。線程是進程的一個執行流,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。一個進程由幾個線程組成,線程與同屬一個進程的其餘的線程共享進程所擁有的所有資源。
地址空間:進程有獨立的地址空間,包括文本區域(text region)、數據區域(data region)和堆棧(stack region);一個進程崩潰後,在保護模式下不會對其它進程產生影響;線程只是一個進程中的不一樣執行路徑,線程有本身的堆棧和局部變量(在運行中必不可少的資源),但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉。同一進程內的線程共享進程的地址空間。
通訊:進程間通訊IPC,線程間能夠直接讀寫進程數據段(如全局變量)來進行通訊——須要進程同步和互斥手段的輔助,以保證數據的一致性。
調度和切換:線程上下文切換比進程上下文切換要快得多。
在多線程OS中,進程不是一個可執行的實體。
地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有本身獨立的地址空間;
資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
線程是處理器調度的基本單位,但進程不是.
兩者都可併發執行.
二、使用線程緣由
在Linux系統下,啓動一個新的進程必須分配給它獨立的地址空間,創建衆多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工做方式。而運行於一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啓動一個線程所花費的空間遠遠小於啓動一個進程所花費的空間,並且,線程間彼此切換所需的時間也遠遠小於進程間切換所須要的時間。
線程間方便的通訊機制。對不一樣進程來講,它們具備獨立的數據空間,要進行數據的傳遞只能經過通訊的方式進行,這種方式不只費時,並且很不方便。線程則否則,因爲同一進程下的線程之間共享數據空間,因此一個線程的數據能夠直接爲其它線程所用,這不只快捷,並且方便。
三、線程操做的函數
#include <pthread.h>
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);
int pthread_join (pthread_t tid, void ** status);
pthread_t pthread_self (void);
int pthread_detach (pthread_t tid);
void pthread_exit (void *status);
pthread_create:用於建立一個線程,成功返回0,不然返回Exxx(爲正數)。
pthread_t *tid:線程id的類型爲pthread_t,一般爲無符號整型,當調用pthread_create成功時,經過*tid指針返回。
const pthread_attr_t *attr:指定建立線程的屬性,如線程優先級、初始棧大小、是否爲守護進程等。可使用NULL來使用默認值,一般狀況下咱們都是使用默認值。
void *(*func) (void *):函數指針func,指定當新的線程建立以後,將執行的函數。
void *arg:線程將執行的函數的參數。嵌入式系統學習意義氣嗚嗚吧久零就易,若是想傳遞多個參數,請將它們封裝在一個結構體中。
pthread_join:用於等待某個線程退出,成功返回0,不然返回Exxx(爲正數)。
pthread_t tid:指定要等待的線程ID
void ** status:若是不爲NULL,那麼線程的返回值存儲在status指向的空間中(這就是爲何status是二級指針的緣由!這種才參數也稱爲「值-結果」參數)。
pthread_self:用於返回當前線程的ID。
pthread_detach:用因而指定線程變爲分離狀態,就像進程脫離終端而變爲後臺進程相似。成功返回0,不然返回Exxx(爲正數)。變爲分離狀態的線程,若是線程退出,它的全部資源將所有釋放。而若是不是分離狀態,線程必須保留它的線程ID,退出狀態直到其它線程對它調用了pthread_join。
pthread_exit用於終止線程,能夠指定返回值,以便其餘線程經過pthread_join函數獲取該線程的返回值。
void *status:指針線程終止的返回值。
四、線程間互斥
使用互斥鎖(互斥)可使線程按順序執行。一般,互斥鎖經過確保一次只有一個線程執行代碼的臨界段來同步多個線程。互斥鎖還能夠保護單線程代碼。
int pthread_mutex_lock(pthread_mutex_t * mptr);
int pthread_mutex_unlock(pthread_mutex_t * mptr);
先聲明一個pthread_mutex_t類型的變量,用做下面兩個函數的參數。在對臨界資源進行操做以前須要pthread_mutex_lock先加鎖,操做完以後pthread_mutex_unlock再解鎖。
五、線程間同步
條件變量:使用條件變量能夠以原子方式阻塞線程,直到某個特定條件爲真爲止。條件變量始終與互斥鎖一塊兒使用。對條件的測試是在互斥鎖(互斥)的保護下進行的。
#include <pthread.h>
int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);
int pthread_cond_signal(pthread_cond_t *cptr);
//Both return: 0 if OK, positive Exxx value on error
pthread_cond_wait用於等待某個特定的條件爲真,pthread_cond_signal用於通知阻塞的線程某個特定的條件爲真了。在調用者兩個函數以前須要聲明一個pthread_cond_t類型的變量,用於這兩個函數的參數。
/*
是否熟悉POSIX多線程編程技術?如熟悉,編寫程序完成以下功能:
1)有一int型全局變量g_Flag初始值爲0;
2)在主線稱中起動線程1,打印「this is thread1」,並將g_Flag設置爲1
3)在主線稱中啓動線程2,打印「this is thread2」,並將g_Flag設置爲2
4)線程序1須要在線程2退出後才能退出
5)主線程在檢測到g_Flag從1變爲2,或者從2變爲1的時候退出 html