UNPv2第七章 互斥鎖與條件變數

2021-07-11 11:21:58 字數 1900 閱讀 8415

#include

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

 pthread_mutex_lock()函式是乙個阻塞型的上鎖函式,若互斥鎖已經上了鎖,呼叫pthread_mutex_lock()函式對互斥鎖再次上鎖的話,呼叫執行緒會阻塞,直到當前互斥鎖被解鎖。

 pthread_mutex_trylock()函式是乙個非阻塞型的上鎖函式,如果互斥鎖沒被鎖住,pthread_mutex_trylock()函式將把互斥鎖加鎖, 並獲得對共享資源的訪問許可權;如果互斥鎖被鎖住了,pthread_mutex_trylock()函式將不會阻塞等待而直接返回ebusy(已加鎖錯誤),表示共享資源處於繁忙狀態。

 如果互斥鎖變數mutex已經上鎖,呼叫pthread_mutex_unlock()函式將解除這個鎖定,否則直接返回。該函式唯一的引數mutex是pthread_mutex_t資料型別的指標。該函式呼叫成功返回0,否則返回-1。

#include

int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);

int pthread_cond_signal(pthread_cond_t *cptr);

均返回:若成功則為0,若出錯則為正的e***值

 pthread_cond_wait() 用於阻塞當前執行緒,等待別的執行緒使用pthread_cond_signal()或pthread_cond_broadcast來喚醒它。 pthread_cond_wait() 必須與pthread_mutex 配套使用。

 pthread_cond_signal函式的作用是傳送乙個訊號給另外乙個正在處於阻塞等待狀態的執行緒,使其脫離阻塞狀態,繼續執行.如果沒有執行緒處在阻塞等待狀態,pthread_cond_signal也會成功返回。

#include

int pthread_cond_broadcast(pthread_cond_t *cptr);

int pthread_cond_timewait(pthread_cond_t *cptr,pthread_mutex_t *mptr, const struct timespc *abstime);

 通常pthread_cond_signal只喚醒等待在相應條件變數上的乙個執行緒。在某些情況下,乙個執行緒認定有多個其他執行緒應被喚醒,這時它可以呼叫pthread_cond_broadcast喚醒阻塞在相應條件變數上的所有執行緒。

 對於pthread_cond_timewait(…),其允許執行緒就阻塞時間設定乙個限制值。

在前面的互斥鎖和條件變數的講解中,我們用兩個常量pthread_mutex_initializer和pthread_cond_initializer來初始化它們。有這種方式初始化的互斥鎖和條件變數具備預設屬性,不過我們還能以非預設屬性來初始化它們。

#include

int pthread_mutex_init(pthread_mutex_t *mptr,const pthread_mutex_mutexattr_t *attr);

int pthread_mutex_destory(pthread_mutex_t *mptr);

int pthread_cond_init(pthread_cond_t *cptr,const pthread_cond_condattr_t *attr);

int pthread_cond_destory(pthread_cond_t *cptr);

UNPv2第八章 讀寫鎖

pthread rwlock rdlock 用來獲取讀出鎖,如果相應的讀出鎖已經被某個寫入者占有,那麼就阻塞呼叫執行緒。pthread rwlock wrlock 用來獲取乙個寫入鎖,如果相應的寫入鎖已經被其它寫入者或者乙個或多個讀出者占有,那麼就阻塞該呼叫執行緒 pthread rwlock un...

UNPv1第七章 套介面選項

這兩個函式僅用於套接字 include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen int setsockopt int sockfd,int level,int optname,const...

第七章 巨集與列舉

規則7 1 1 用巨集定義表示式時,要使用完備的括號。說明 m為巨集只是簡單的 替換,不會像函式一樣先將引數計算後,再傳遞。示例 如下定義的巨集都存在一定的風險。反例 若有除法運算,c a b計算錯誤 define rectangle area a,b a b a 1 b 1計算錯誤 define ...