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

2021-08-27 01:11:28 字數 2542 閱讀 3564

一、概述

在《執行緒程式設計常見api簡介(上) 》中講述了有關執行緒建立過程中常用的 api 的使用方法,本節繼續講述有關執行緒程式設計中常用 api 的使用方法。主要說明有關執行緒鎖、執行緒區域性變數等 api 的使用。

二、常用 api

1)執行緒鎖 api

1.1)執行緒鎖的初始化及銷毀:pthread_mutex_init/pthread_mutex_destroy;在 acl 庫中對應的 api 為:acl_pthread_mutex_init/acl_pthread_mutex_destroy。

/**

* 初始化執行緒鎖物件

* @param mutex 執行緒鎖物件

* @param attr 執行緒鎖屬性物件

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

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

/** * 銷毀執行緒鎖資源

* @param mutex 執行緒鎖物件,之前必須成功呼叫了

* pthread_mutex_init 初始化了執行緒鎖物件

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

*/int pthread_mutex_destroy(pthread_mutex_t *mutex);

1.2)執行緒鎖屬性物件的初始化及銷毀:pthread_mutexattr_init/pthread_mutexattr_destroy。

/**

* 初始化執行緒鎖屬性物件

* @param attr 執行緒鎖屬性物件

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

*/int pthread_mutexattr_init(pthread_mutexattr_t *attr);

/** * 銷毀在初始化執行緒鎖屬性物件時分配的內部資源

* @param attr 執行緒鎖屬性物件

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

*/int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

除了上面所列出的初始化執行緒鎖的方法外,在linux**下還有乙個快速對執行緒鎖進行初始化的方法,如下宣告執行緒鎖變數即可:

pthread_mutex_t mutex = pthread_mutex_initializer;
1.3)執行緒鎖加鎖解鎖 api:pthread_mutex_lock/pthread_mutex_unlock;在 acl 庫中相應的表現形式為:acl_pthread_mutex_lock/acl_pthread_mutex_unlock。

/**

* 對執行緒鎖加鎖,一直至成功加鎖或出錯為止

* @param mutex 執行緒鎖物件

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

*/int pthread_mutex_lock(pthread_mutex_t *mutex);

/** * 對加鎖的執行緒鎖解鎖

* @param mutex 執行緒鎖物件

* @return 返回 0 表示成功解鎖,否則表示出錯,出錯原因一般為:

* 執行緒鎖物件無效或當前該解鎖執行緒並未擁有該執行緒鎖

*/int pthread_mutex_unlock(pthread_mutex_t *mutex);

除了上面提到的阻塞式加鎖方法,還有乙個非阻塞式的加鎖方法,呼叫 pthread_mutex_trylock api:

/**

* 嘗試對執行緒鎖加鎖,如果該鎖未被其它執行緒擁有,則本加鎖執行緒便加鎖

* 成功,否則立即返回,並返回 ebusy 表示該執行緒鎖正被其它執行緒擁有

* @param mutex 執行緒鎖物件

* @return 返回 0 表示成功加鎖,否則返回未成功加鎖原因,一般

* 原因有:執行緒鎖物件無效,或該鎖正被其它執行緒加鎖

*/int pthread_mutex_trylock(pthread_mutex_t *mutex);

需要區分 pthread_mutex_lock 和 pthread_mutex_trylock 兩種不同加鎖方法,前者在成功加鎖前會一直阻塞到其它執行緒釋放鎖(或出錯了),後者則會立即返回,根據其返回值來檢查是否成功加鎖。

2)執行緒鎖示例

下面以乙個例子來簡要說明一下上面執行緒鎖的一些 api 的使用方法:

#include #include /* 全域性靜態執行緒鎖 */

static pthread_mutex_t __mutex;

/* 全域性靜態變數 */

static int __count = 0;

static void *thread_fn(void *arg)

int main(void)

3) 執行緒區域性變數

有關執行緒區域性變數的含義、api以及使用示例,請參考另外兩篇文章:《多執行緒開發時執行緒區域性變數的使用》,《再談執行緒區域性變數》。

個人微博:

github:

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

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

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

一 概述 本節將繼續說明有關執行緒程式設計常用 api 的使用方法,主要說一下與執行緒條件變數及執行緒訊號通知的 api。通過這些 api 可以實現執行緒之間的同步及通訊機制。二 執行緒條件變數 api 1 初始化 銷毀執行緒條件變數 pthread cond init pthread cond d...

網路程式設計api介面簡介

客戶端 int main printf ip s,port d n inet ntoa caddr.sin addr.s addr ntohs caddr.sin port 由於是自主設定的ip區域網所以不使用ntohl,類似有htonl,ntohl,htons,ntohs。while 1 if r...