執行緒程式設計常見API簡介(下)

2021-08-27 01:12:36 字數 2589 閱讀 3898

一、概述

本節將繼續說明有關執行緒程式設計常用 api 的使用方法,主要說一下與執行緒條件變數及執行緒訊號通知的 api。通過這些 api 可以實現執行緒之間的同步及通訊機制。

二、執行緒條件變數 api

1)初始化/銷毀執行緒條件變數:pthread_cond_init/pthread_cond_destroy;在 acl 庫中相應的 api 為 acl_pthread_cond_init/acl_pthread_cond_destroy。

/**

* 用執行緒條件變數屬性初始化執行緒條件變數物件

* @param cond 執行緒條件變數物件

* @param attr 條件變數屬性,用來設定執行緒

* 條件變數的屬性,該引數可以由 pthread_condattr_init/pthread_condattr_destroy 初始化和銷毀;該引數可以設為 null

* @return 返回 0 表示成功,否則出錯,錯誤號可以用 strerror 列印

*/int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

/** * 銷毀執行緒條件變數物件通過 pthread_cond_init 分配的資源

* @param cond 執行緒條件變數物件

* @return 返回 0 表示成功,否則出錯

*/int pthread_cond_destroy(pthread_cond_t *cond);

2)等待執行緒條件變數被其它執行緒通知:pthread_cond_wait/pthread_cond_timedwait,在 acl 庫中對應的 api 為 acl_pthread_cond_wait/acl_pthread_cond_timedwait。

/**

* 擁有執行緒鎖;當執行緒條件變數被通知時,該執行緒首先會對執行緒鎖加鎖,然後返回

* 給呼叫者,即當該 api 返回時,當前執行緒已經擁有了其中的執行緒鎖

* @param cond 執行緒條件變數物件

* @param mutex 與執行緒條件變數配合使用的執行緒鎖

* @return 返回 0 表示阻塞當前執行緒的執行緒條件變數被其它執行緒通知,同

* 時當前執行緒獲得相應的執行緒鎖;否則,表示出錯,出錯原因一般是輸入的引數非法

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

/** * 超時時間到達,該 api 相比 pthread_cond_wait 多出乙個等待超時時間

* @param cond 執行緒條件變數物件

* @param mutex 與執行緒條件變數配合使用的執行緒鎖

* @param abstime 超時時間截,當時間超過該

* 時間截後,即使執行緒條件變數未被通知,該 api 也會返回

* @return 返回 0 表示阻塞當前執行緒的執行緒條件變數被其它執行緒通知,同

* 時當前執行緒獲得相應的執行緒鎖;否則,如果返回值為 etimedout(在 acl 庫

* 中表示為 acl_etimedout)則表示該 api 是因為超時才返回的,同時會將

* 執行緒鎖加鎖,當為其它返回值時一般是因為輸入引數非法導致

*/int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

上面兩個等待執行緒條件變數的 api中,pthread_cond_timedwait 對於設計半駐留式執行緒非常有用,象 acl 庫中的半駐留式執行緒池就用到了它。

/**

* 喚醒阻塞在某個執行緒條件變數上的乙個執行緒

* @param cond 執行緒條件變數物件

* @return 返回 0 表示成功,否則表示出錯

*/int pthread_cond_signal(pthread_cond_t *cond);

/** * 所有執行緒被喚醒後,會首先搶占引數中輸入的執行緒鎖(有可能是同乙個執行緒鎖,

* 也有可能不是),在獲得那個執行緒鎖後那些被喚醒的執行緒才會返回

* @param cond 執行緒條件變數物件

* 表示出錯

*/int pthread_cond_broadcast(pthread_cond_t *cond);

三、示例

#include #include #include /* 快速初始化執行緒鎖和執行緒條件變數 */

static pthread_mutex_t __mutex = pthread_mutex_initializer;

static pthread_cond_t __cond = pthread_cond_initializer;

static void *thread_waiting(void* arg)

int main(void)

該例子非常簡單,使用者可以在自己的程式中靈活使用這些 api。

個人微博:

執行緒程式設計常見api簡介(上)

執行緒程式設計常見api簡介(中)

github:

執行緒程式設計常見API簡介(中)

一 概述 在 執行緒程式設計常見api簡介 上 中講述了有關執行緒建立過程中常用的 api 的使用方法,本節繼續講述有關執行緒程式設計中常用 api 的使用方法。主要說明有關執行緒鎖 執行緒區域性變數等 api 的使用。二 常用 api 1 執行緒鎖 api 1.1 執行緒鎖的初始化及銷毀 pthr...

執行緒程式設計常見API簡介(中)

一 概述 在 執行緒程式設計常見api簡介 上 中講述了有關執行緒建立過程中常用的 api 的使用方法,本節繼續講述有關執行緒程式設計中常用 api 的使用方法。主要說明有關執行緒鎖 執行緒區域性變數等 api 的使用。二 常用 api 1 執行緒鎖 api 1.1 執行緒鎖的初始化及銷毀 pthr...

陣列下常見api

乙個變數 儲存多個值 陣列是線性的 除了第乙個元素,每乙個元素都有乙個前驅元素,除了最後乙個元素,每乙個元素都有乙個後驅元素 var arr var arr 1,2,3,4,5,6,87 var arr new array var arr new array 1,2,3,4,5 如何獲取陣列中的元素...