linux多執行緒

2021-07-04 18:10:45 字數 3557 閱讀 8603

執行緒標識:

就像每個程序都有乙個id一樣,執行緒也有自己的id。

程序id用pid_t來表示,他是乙個unsigned int。

程序id用pthread_t來表示,pthread_t不能把它當整數處理。

程序可以通過pthread_self()函式獲得自身的執行緒id。

執行緒建立:

在程序中只有乙個控制線程

程式開始執行的時候每個程序只有乙個執行緒,他是以單執行緒方式啟動的,在建立多個執行緒以前,程序的行為與傳統的程序沒有區別。

gcc在鏈結的時候需要新增-lpthread選項

建立乙個執行緒呼叫pthread_create函式。

#include

int pthread_creatc(pthread_t *thread,const pthread _attr_t *attr,void *(*start_routine)(void *),void *arg);

若執行緒建立成功,則返回0。若執行緒建立失敗,則返回出錯編號,並且*thread中的內容是未定義的。

返回成功時,由tidp指向的記憶體單元被設定為新建立執行緒的執行緒id。attr引數用於指定各種不同的執行緒屬性。新建立的執行緒從start_rtn函式的位址開始執行,該函式只有乙個萬能指標引數arg,如果需要向start_rtn函式傳遞的引數不止乙個,那麼需要把這些引數放到乙個結構中,然後把這個結構的位址作為arg的引數傳入。

linux下用c語言開發多執行緒程式,linux系統下的多執行緒遵循posix執行緒介面,稱為pthread。

由 restrict 修飾的指標是最初唯一對指標所指向的物件進行訪問的方法,僅當第二個指標基於第乙個時,才能對物件進行訪問。對物件的訪問都限定於基於由 restrict 修飾的指標表示式中。 由 restrict 修飾的指標主要用於函式形參,或指向由 malloc() 分配的記憶體空間。restrict 資料型別不改變程式的語義。 編譯器能通過作出 restrict 修飾的指標是訪問物件的唯一方法的假設,更好地優化某些型別的例程。

引數第乙個引數為指向執行緒識別符號的指標。

第二個引數用來設定執行緒屬性。

第三個引數是執行緒執行函式的起始位址。

最後乙個引數是執行函式的引數。

注意事項

因為pthread並非linux系統的預設庫,而是posix執行緒庫。在linux中將其作為乙個庫來使用,因此加上 -lpthread(或-pthread)以顯式鏈結該庫。函式在執行錯誤時的錯誤資訊將作為返回值返回,並不修改系統全域性變數errno,當然也無法使用perror()列印錯誤資訊。

執行緒終止:

任一線程呼叫了exit函式,整個程序都會終止。

如果訊號預設動作是終止程序,那麼訊號傳送到該執行緒,整個程序也會被終止。

單個執行緒通過以下三種方式退出:

執行緒只是從啟動函式中返回,返回值是執行緒的退出碼。

執行緒可以被同一程序中的其他執行緒取消。

執行緒呼叫pthread_exit。

判斷是否為同一條執行緒:

int pthread_equal(pthread_t th1,pthread_t th2);函式比較th1和th2是否為同乙個執行緒,所以不能用比較整數的方式比較pthread_t。

如果th1和th2相同,函式返回非0值,如果不同函式返回0.

執行緒屬性:

以前呼叫pthread_create傳入的attr引數都是空指標,而不是指向pthread_attr_t結構的指標。

可以使用pthread_attr_t結構修改執行緒預設屬性,並把這些屬性與建立的執行緒聯絡起來。

可以使用pthread_attr_init函式初始化pthread_attr_t結構。

呼叫pthread_attr_init以後,pthread_arrt_t的結構所包含的內容就是作業系統實現支援多執行緒所有的屬性的預設值。 如果要修改其中個別屬性的值需要呼叫其他函式。

int pthread_attr_destroy(pthread_attr_t *attr);

int pthread_attr_init(pthread_attr_t *attr);

函式pthread_attr_init初始化attr結構

函式pthread_attr_destroy()釋放attr記憶體空間

pthread_attr_t的結構對於應用程式來講是不透明的,應用程式不需要了解有關結構的內部組成。

int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);

函式pthread_attr_setdetachstate把執行緒屬性設定為下面兩個合法值之一

pthread_create_detached 設定執行緒為分離狀態

pthread_create_joinable  設定執行緒為正常狀態

原子操作:

i++mov eax,i

add eax,1

計算機每次只執行一句彙編**,而c++**大多都不是原子操作

執行緒同步:

執行緒共享程序的記憶體空間,開啟的檔案描述符,全域性變數。

當有多個執行緒同時訪問一塊記憶體空間或者乙個變數。乙個檔案描述符,如果不加控制,那麼可能會出現意想不到的結果。

互斥(mutex)是相互排斥的意思,它是一種鎖或者訊號燈。

互斥用來保護多個執行緒共享的資料和結構不會被同時修改,乙個互斥鎖只能有兩個狀態

---locked---加鎖

---unlocked-解鎖

加鎖後互斥不讓其他執行緒訪問。

任何時刻只能有乙個執行緒來掌握某個互斥上鎖。

乙個執行緒如果試圖在乙個已經加鎖的互斥上再加鎖,這個執行緒會被掛起,知道加鎖的執行緒釋放掉所有的互斥鎖為止。

pthread_mutex_t mutex=pthread_mutex_initalizer;

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

pthread_mutex_initialzer是初始化乙個快速縮的巨集定義。

pthread_mutex_lock用於給mutex加鎖

pthread_mutex_unlock用於給mutex解鎖。

pthread_mutex_unlock()

加鎖返回0  沒加鎖返回錯誤值

當有乙個執行緒未解鎖的時候被結束會出現死鎖!!!!

原子鎖實現多執行緒同步**:

#include #include #include #include pthread_mutex_t mutex=pthread_mutex_initializer;

void pr(void *p)

pthread_mutex_unlock(&mutex);

}int main()

if(pthread_create(&thread2,null,pr,&i[1])!=0);

pthread_join(thread1,null);

pthread_join(thread1,null);

}

多執行緒引數傳遞小竅門:

傳遞單個引數  傳遞變數位址

需要傳遞多個引數 可以傳遞結構體(指標)

linux多執行緒

linux下為了多執行緒同步,通常用到鎖的概念。posix下抽象了乙個鎖型別的結構 ptread mutex t。通過對該結構的操作,來判斷資源是否可以訪問。顧名思義,加鎖 lock 後,別人就無法開啟,只有當鎖沒有關閉 unlock 的時候才能訪問資源。它主要用如下5個函式進行操作。1 pthre...

Linux多執行緒

一 執行緒的特點 1.執行緒是程序的乙個執行流,是cpu排程和分配的基本單位。執行緒是程式執行的最小單位。2.執行緒不會影響到其它執行緒的執行。比如乙個執行緒崩潰,其它執行緒正常執行。3.同一程序內的執行緒共享程序的位址空間。二 乙個執行緒的組成 1.乙個指向當前被執行指令的指令指標 2.乙個棧空間...

linux多執行緒

原型 int pthread create pthread t thread,const pthread attr t attr,功能 建立新的執行緒,成功返回0,失敗返回錯誤編號 引數 thread 用來儲存新建立的執行緒id attr 乙個指向pthread attr t結構的指標,指向的結構決...