APUE之執行緒(五)

2021-07-10 19:01:46 字數 3381 閱讀 6956

執行緒同步:

讀寫鎖:

繼續往下說執行緒同步問題。讀寫鎖與互斥量類似,但是讀寫鎖的好處是允許更高的並行性。讀寫鎖有三種狀態:讀模式下加鎖狀態,寫模式下加鎖狀態,不加鎖狀態。下面有中情況需要說明以下,寫加鎖狀態時,未被解鎖的時候,所有試圖對這個鎖進行加鎖的執行緒都會被阻塞。讀加鎖狀態時,所有以讀模式對它進行加鎖的執行緒都可以得到訪問的許可權,但是如果執行緒希望以寫模式對此鎖進行加鎖時,必須阻塞到所有執行緒釋放讀鎖。讀寫鎖比較適合與對於資料結構讀的次數遠遠大於寫的情況。

與互斥量一樣,讀寫鎖在使用的時候也需要初始化,在釋放他們底層的記憶體前必須銷毀。

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

int pthread_rwlock_destory(pthread_rwlock_t *rwlock);

pthread_rwlock_init()進行初始化,釋放讀寫鎖占用的記憶體前,用pthread_rwlock_destory()做清理工作。

下面就是三種鎖的函式:

#include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//讀鎖

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//寫鎖

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);//解鎖

補充一下有條件的讀寫鎖原語:
#include int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

下面的程式是使用讀寫鎖的乙個例子:
/*

*name : list11_8.c

*author : lniper

*date : 2016-02-17

*aim : using the write and read lock.

*/#include #include struct job;

struct queue;

/* *initialize a queue.

*/int queue_init(struct queue *qp)

/* *insert a job at the head of the queue.

*/void job_insert(struct queue *qp, struct job *jp)

/* */

/* *remove the given job from a queue.

*/void job_remove(struct queue *qp, struct job *jp)

else if (jp == qp->q_tail) else

pthread_rwlock_unlock(&qp->q_lock);

}/*

*find a job for the given thread id.

*/struct job *job_find(struct queue *qp, pthread_t id)

這個例子中,無論什麼時候需要增加乙個作業到佇列中或者從佇列中刪除作業,都用寫模式鎖住佇列的讀寫鎖。另外無論什麼時候搜尋佇列,首先需要獲取讀模式下的鎖,允許所有的工作執行緒併發的搜尋佇列。這種情況下如果想改善效能,只有執行緒搜尋佇列的頻率遠遠高於增加或者刪除作業的頻率。

條件變數:

這個是執行緒可用的另一種同步機制。條件變數給多個執行緒提供了乙個會合的場所。條件變數和互斥量一起使用的時候,允許執行緒以無競爭的方式等待特定的條件發生。

#include int pthread_cond_init(pthread_cond_t *restrict cond, pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pthread_cond_t *cond);

pthread_cond_init()函式是動態分配的初始化函式,pthread_cond_initializer分給靜態分配的條件變數。pthread_cond_destroy()函式對條件變數進行去除初始化。
#include int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict timeout);

pthread_cond_timedwait()函式提供了timeout,timeout指定了等待的時間,通過timespec結構指定。時間用秒數或者分秒數來表示(納秒)。

struct timespec ;
下面提供兩個函式對於喚醒等待條件的某個或者所有的執行緒:

#include int pthread_cond_signal(pthread_cond_t *cond);//喚醒等待該條件的某個執行緒

int pthread_cond_broadcast(pthread_cond_t *cond);//喚醒等待該條件的所有執行緒

下面的**是結合條件變數和互斥量對執行緒進行同步。

/*

*name : list11_9.c

*author : lniper

*date : 2016-02-17

*aim : the condition variable and mutex make the thread synchronization.

*/#include struct msg;

structy msg *workq;

pthread_cond_t qready = pthread_cond_initializer;

pthread_mutex_t qlock = pthread_mutex_initializer;

void process_msg(void)}

void enqueue_msg(struct msg *mp)

總結:

對於執行緒的同步的三種基本的機制:互斥,讀寫鎖以及條件變數。對於執行緒的同步還需要多多的實踐,編寫程式才能更好的理解執行緒同步的精髓。

APUE之執行緒初探

執行緒 什麼是執行緒?很多介紹都是 輕量級的程序 不過感覺執行緒的定義一直都比較模糊,沒有找到什麼具體的定義。倒是覺得 程序是資源分配的最小單位,執行緒是排程的基本單位 這個說法算是比較認可的。現在主要探索的就是apue中提供的關於執行緒的相關函式。執行緒標示 和程序一樣,執行緒也有自己的id,li...

APUE之執行緒(四)

執行緒同步 執行緒同步問題,可以說是每一本經典的作業系統教程都能會提到。簡單的說就是對於乙個變數,如果乙個程序可以修改,其他的程序也可以讀取或者修改這個變數的時候,就需要對這些程序進行同步,以確保他們在訪問變數儲存的內容的時候不會訪問到無效的資料。互斥量 互斥變數的資料型別用pthread mute...

APUE學習筆記 執行緒

採用多執行緒模式可以採用同步程式設計,而非非同步程式設計,可以簡化程式設計 多個程序間可以很方便的共享資料 可以通過pthread self獲得自身的執行緒id。執行緒id只在程序內部唯一。新建立執行緒不能保證那個執行緒先執行,新縣城可以訪問程序的位址空間,繼承執行緒的浮點環境和訊號遮蔽字。如果任意...