專案經驗 之執行緒基本知識

2021-10-01 01:38:22 字數 4030 閱讀 5048

一、執行緒標識

每個執行緒有乙個執行緒id,執行緒id用pthread_t型別表示,可移植作業系統一般不能把它作為整數處理。

linux下的pthread,一般的實現是:

程序id: pid_t pid; //pid_t: unsigned int

執行緒id:pthread_t tid; //pthread_t: unsigned long int

執行緒id比較:

#include

int pthread_equal(pthead_t t1, pthread_t t2);

獲取自身執行緒id:

#include

pthread_t pthread_self(void);

二、執行緒建立

#inlude

int pthread_create(pthread_t *thread, const pthread_attr_t attr, void(start_routine)(void), void *arg);

thread:出參, 返回執行緒號;

attr:執行緒屬性,一般是null;

start_routine: 執行緒的執行函式實體;

arg: 執行緒的執行函式入參;

三、執行緒終止

程序中任一線程呼叫了exit,_exit或_exit則整個程序都會終止,類似的,如果訊號的預設動作是終止程序,那麼,把該訊號傳送到執行緒也會終止整個程序。

單個執行緒退出有三種方式:

(1)、執行緒只是從啟動例程中返回,返回值是執行緒的退出碼;

(2)、執行緒可以被同一程序中其他執行緒取消;

(3)、執行緒呼叫pthread_exit;

#includevoid pthread_exit(void *retval);

int pthread_join(pthread_t thread, void **retval);

pthread_join用來等待執行緒的終止,呼叫執行緒將一直阻塞,直到執行緒呼叫pthread_exit、從啟動例程返回或被取消。

四、執行緒建立

#include

int pthread_cancel(pthread_t thread);

pthread_cancel函式用來取消同一程序中其他執行緒。預設情況下制定的tid執行緒相當於呼叫了引數為pthread_canceled的pthread_exit函式;該函式僅傳送取消請求,執行緒可以選擇忽略取消方法或者控制取消方式;

#includeint pthread_detach(pthread_t thread);
五、執行緒同步

競爭條件與臨界區:

多個執行緒同時訪問同乙個資源且結果與執行緒訪問資源時的順序有關的這樣一種情形就叫競爭條件。

臨界區指乙個訪問共同資源的程式片段。

互斥量:

通過使用pthread的互斥介面保護資料,確保同一時間只有乙個執行緒訪問資料。互斥量本質上是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成後釋放互斥量上的鎖。對互斥量進行加鎖後,任何其他試圖再次對互斥量加鎖的執行緒將會被阻塞直至當前執行緒釋放該互斥鎖。

互斥量初始化:

互斥量使用前需要先初始化,可以初始化為常量pthread_mutex_initializer(只對靜態分配的互斥量);也可以通過呼叫pthread_mutex_init函式初始化,如果動態分配互斥量,釋放記憶體前需要呼叫:

pthread_mutex_destory

#includeint pthread_mutex_destory(pthread_mutex_t *mutex);

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

pthread_mutex_t mutex = pthread_mutex_initializer;

加鎖與釋放鎖:

#includeint 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_timedlock(pthread_mutex_t *mutex);

其中,如果互斥量已經上鎖,則呼叫pthread_mutex_lock會阻塞直到互斥量解鎖,如果不希望阻塞,則使用pthread_mutex_trylock,當互斥量未上鎖則加鎖,已加鎖則出錯返回ebusy。

死鎖: 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,他們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序或執行緒稱為死鎖程序或執行緒。

產生死鎖的四個必要條件:

a\ 互斥條件:乙個資源每次只能被乙個程序或執行緒使用。

b\ 請求與保持條件:乙個程序或執行緒因請求資源而阻塞時,對已獲得的資源保持不放。

c\ 不剝奪條件:此程序或執行緒已獲得的資源,在未使用完之前,不能強行剝奪。

d\ 迴圈等待條件:多個程序或執行緒之間形成一種頭尾相接的迴圈等待資源關係。

讀寫鎖:

讀寫鎖與互斥量類似,不過讀寫鎖允許更高的並行性。互斥量要麼是加鎖狀態,要麼是不加鎖狀態。而讀寫鎖有三種狀態:讀模式加鎖狀態、寫模式加鎖狀態、不加鎖狀態。一次只有乙個執行緒可以占有寫模式的讀寫鎖,但多個執行緒可以同時占有讀模式的讀寫鎖。

讀寫鎖是寫加鎖狀態時,在這個鎖解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是如果執行緒希望以寫模式對此鎖加鎖,它必須阻塞直到所有的執行緒釋放讀鎖。

#includeint pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

條件變數:

條件變數與互斥量一起使用時,允許執行緒以五競爭的方式等待特定的條件發生。而條件變數本身需要互斥量保護,執行緒在改變條件狀態前必須首先鎖住互斥量,其他執行緒在獲得互斥量之前不會察覺到這種變化,因此必須鎖住互斥量以後才能計算條件。

#includeint pthread_cond_int(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pthread_cond_t *cond);

pthread_cond_t cond = pthread_cond_initializer;

int pthread_cond_timedwait(pthreadc_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

int pthread_cond_signal

int pthread_cond_broadcast

執行緒的基本知識

beginthreadex的一些要點 1.每個執行緒均獲得c c 執行時庫的棧分配的自己的tiddata記憶體結構 2.傳遞給 beginthreadex的執行緒函式的位址和引數儲存在tiddata記憶體塊中 3.beginthreadex從內部呼叫createthread,因為這是作業系統內部了解...

執行緒程式設計基本知識介紹

執行緒程式設計基本知識介紹 執行緒程式設計基本知識介紹,常用執行緒函式列舉 與執行緒相關的函式可以分類歸結為以下幾個部分 1 執行緒管理函式,包括執行緒的建立,退出,函式為 pthread create,pthread join,pthread exit,pthread self,pthread c...

專案管理(1) 基本知識

1.什麼是專案 就是在特定的資源和要求的約束下,為了提供某項獨特產品 服務或成果所做的臨時性努力。特徵 目的性 時限性 唯一性 合作性2.什麼是專案管理 就是把各中知識 技能 手段和技術等應用於專案活動中,以達到專案的要求。3.專案經理 專案經理就是負責實現專案目標的人。需要掌握的知識領域包括 專案...