我的專題整理之多執行緒程式設計

2022-09-14 06:48:09 字數 3186 閱讀 3919

唉,實在是時間不允許,就不一一整理了,直接將別人寫的好的粘過來了,源文位址我都貼在開頭部分,各位可以直接點進去看別人的大作。

linux下多執行緒程式設計概念:

linux下多執行緒程式設計示例:

一 程序和執行緒

程序是程式在資料集上的一次執行的實體,從核心觀點看,程序是擔當系統分配資源的基本單位。程序有獨立的位址空間,乙個程序崩潰後,在保護模式下不會對其它程序產生影響。

執行緒是程序的乙個執行流,是cpu排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位。乙個程序由幾個執行緒組成(擁有很多相對獨立的執行流的使用者程式共享應用程式的大部分資料結構),執行緒與同屬乙個程序的其他的執行緒共享程序所擁有的全部資源。執行緒有自己的堆疊和區域性變數,但執行緒沒有單獨的位址空間。

相比於程序,使用多執行緒具有如下優點:

1)執行緒共享程序的資源,因而建立、切換和撤銷的代價更小

2)執行緒間方便的通訊機制。對不同程序來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過通訊的方式進行,這種方式不僅費時,而且很不方便。執行緒則不然, 由於同一程序下的執行緒之間共享資料空間,所以乙個執行緒的資料可以直接為其它執行緒所用,這不僅快捷,而且方便。當然,資料的共享也帶來其他一些問題,有的變 量不能同時被兩個執行緒所修改,有的子程式中宣告為static的資料更有可能給多執行緒程式帶來災難性的打擊,這些正是編寫多執行緒程式時最需要注意的地方。

3)提高應用程式響應

4)使多cpu系統更加有效。作業系統會保證當執行緒數不大於cpu數目時,不同的執行緒執行於不同的cpu上(多個程序不能同時執行於多個cpu上嗎?

)。5)改善程式結構。乙個既長又複雜的程序可以考慮分為多個執行緒,成為幾個獨立或半獨立的執行部分,這樣的程式會利於理解和修改。

二 linux下的執行緒操作

(1)執行緒的建立、退出和等待

#include 

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,否則返回e***(為正數)。

pthread_join用於等待某個執行緒退出,成功返回0,否則返回e***(為正數)。

pthread_self用於返回當前執行緒的id。

pthread_detach用於是指定執行緒變為分離狀態,就像程序脫離終端而變為後台程序類似。成功返回0,否則返回e***(為正數)。變為分離狀態的執行緒,如果執行緒退出,它的所有資源將全部釋放。而如果不是分離狀態,執行緒必須保留它的執行緒id,退出狀態直到其它執行緒對它呼叫了pthread_join。

pthread_exit用於終止執行緒,可以指定返回值,以便其他執行緒通過pthread_join函式獲取該執行緒的返回值。

(2)執行緒的互斥鎖

使用互斥鎖(互斥)可以使執行緒按順序執行。通常,互斥鎖通過確保一次只有乙個執行緒執行**的臨界段來同步多個執行緒。互斥鎖還可以保護單執行緒**。

#include int pthread_mutex_lock(pthread_mutex_t * mptr); 

int pthread_mutex_unlock(pthread_mutex_t * mptr);

//both return: 0 if ok, positive e*** value on error

在對臨界資源進行操作之前需要pthread_mutex_lock先加鎖,操作完之後pthread_mutex_unlock再解鎖。而且在這之前需要宣告乙個pthread_mutex_t型別的變數,用作前面兩個函式的引數。

(3)條件變數

#include 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 e*** value on error

pthread_cond_wait用於等待某個特定的條件為真,pthread_cond_signal用於通知阻塞的執行緒某個特定的條件為真了。在呼叫者兩個函式之前需要宣告乙個pthread_cond_t型別的變數,用於這兩個函式的引數。

為什麼條件變數始終與互斥鎖一起使用,對條件的測試是在互斥鎖(互斥)的保護下進行的呢?因為「某個特性條件」通常是在多個執行緒之間共享的某個變數。互斥鎖允許這個變數可以在不同的執行緒中設定和檢測。

通常,pthread_cond_wait只是喚醒等待某個條件變數的乙個執行緒。如果需要喚醒所有等待某個條件變數的執行緒,需要呼叫:

int

pthread_cond_broadcast (pthread_cond_t * cptr);

預設情況下面,阻塞的執行緒會一直等待,知道某個條件變數為真。如果想設定最大的阻塞時間可以呼叫:

int

pthread_cond_timedwait (pthread_cond_t * cptr, pthread_mutex_t *mptr, const

struct timespec *abstime);

如果時間到了,條件變數還沒有為真,仍然返回,返回值為etime。

(4)訊號量

sem_init(sem_t *__sem, int __pshared, unsigned int __value

)用來初始化乙個訊號量

。sem_post(sem_t *sem

)增加訊號量,當有執行緒阻塞在這個訊號量上時,呼叫這個函式會使其中的乙個執行緒不在阻塞,選擇機制同樣是由執行緒的排程策略決定的。

sem_wait(sem_t *sem

)減少訊號量,被用來阻塞當前執行緒直到訊號量sem的值大於0,解除阻塞後將sem的值減一,表明公共資源經使用後減少。函式sem_trywait ( sem_t *sem )是函式sem_wait()的非阻塞版本,它直接將訊號量sem的值減一。

sem_destroy(sem_t *sem)用來釋放訊號量sem。

C 之多執行緒程式設計

一.程序與執行緒 程序 process 是對一段靜態指令序列 程式 的動態執行過程,是系統進行資源分配和排程的乙個基本單位。與程序相關的資訊 包括程序的使用者標識,正在執行的已經編譯好的程式,程序程式和資料在儲存器中的位置等。同乙個程序又可以劃分為若干個獨立的執行流,我們稱之為執行緒 thread ...

併發程式設計專題之多執行緒之間實現通訊

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。共享資源源實體類,兩個執行緒將會對類中變數進行讀和寫操作 class res寫執行緒資源 class intthrad e...

Python多執行緒程式設計之多執行緒加鎖

python語言本身是支援多執行緒的,不像php語言。下面的例子是多個執行緒做同一批任務,任務總是有task num個,每次執行緒做乙個任務 print 做完後繼續取任務,直到所有任務完成為止。1 coding utf 8 2import threading 34 start task 0 5 ta...