linux c++介面超時設計
技術標籤:c++
linux c++介面超時設計
先說明一下環境,是linux平臺c++,ndk編譯環境。但函式的原理是相通的,windows環境也有對應的函式,所以需要理解的是介面的設計思想。那我們開始吧!
需求:等待一個http請求返回,若超時(假定3秒),則返回錯誤碼並忽略後續動作的執行。若規定時間內返回,則執行後續動作。
首先需要了解幾個概念:
多執行緒
一個程序是由若干執行緒組成的。這些執行緒之間:
共享 程序的堆空間、全域性變數、靜態變數、檔案等公用資源。
獨佔 棧、暫存器
執行緒同步
多執行緒之間的同步就是因為執行緒之間有共享的資源而產生的,試想一下如果某個資原始檔同一時刻,先後被多個執行緒修改,那最終的結果是不確定的,我們應該防止這種情況的發生。所以同步的含義是,多個執行緒之間應該是“有序”地 排隊訪問獨佔資源,消除結果的不確定性。
多執行緒同步的方式如下:
互斥鎖
條件變數
讀寫鎖
訊號量
互斥鎖
概念
互斥鎖是一種簡單的加鎖的方法來控制對共享資源的訪問,互斥鎖只有兩種狀態,即上鎖( lock )和解鎖( unlock )
宣告互斥鎖
pthread_mutex_t _mutex_api;
動態初始化互斥量(還有靜態初始化,適用於區域性變數)
標頭檔案
#include <pthread.h>
@mutex :指向互斥鎖的指標
@attr :互斥量屬性,一般傳NULL表示使用預設屬性,即快速互斥鎖(指呼叫執行緒會阻塞直到執行緒鎖得到解鎖為止)
@return:成功返回0,其餘均表示錯誤
int pthread_mutex_init (pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
例子
pthread_mutex_init(&_mutex_api, NULL);
上鎖
@mutex @return 同上
int pthread_mutex_lock(pthread_mutex_t* mutex);
例子
pthread_mutex_lock(&_mutex_api)
解鎖
@mutex @return 同上
int pthread_mutex_unlock (pthread_mutex_t *mutex)
例子
pthread_mutex_unlock(&_mutex_api)
銷燬互斥鎖
@mutex @return 同上
int pthread_mutex_destroy(pthread_mutex_t *mutex)
例子
pthread_mutex_destroy(&_mutex_api)
條件變數
- 概念
條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞一個執行緒,直到某特殊情況發生為止。適合多個執行緒等待某個條件的發生,不使用條件變數,那麼每個執行緒就不斷嘗試互斥鎖並檢測條件是否發生,浪費系統資源。
宣告條件變數
pthread_cond_t _cond_api;
初始化條件變數
@cv 指向條件變數的指標
@cattr 條件變數屬性,一般傳NULL
@return 返回0
int pthread_cond_init(pthread_cond_t *cv,
const pthread_condattr_t *cattr);
例子
pthread_cond_init(&_cond_api, NULL);
等待函式
函式原型
@cv @return同上
@mp 指向互斥鎖的指標
@abstime 等待時間,是個結構體,tv_sec(秒) tv_usec(納秒)
int pthread_cond_timedwait(pthread_cond_t *cv,
pthread_mutex_t *mp,
const struct timespec *abstime);
例子
pthread_cond_timedwait(&_cond_api, _mutex_api, 3);
阻塞一個執行緒
int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);
解除阻塞一個執行緒
int pthread_cond_signal(pthread_cond_t *cv);
銷燬條件變數
int pthread_cond_destroy(pthread_cond_t *cv);
接下來說明設計的思路:
條件變數需要和互斥鎖結合起來使用。在主執行緒裡起一個新的執行緒訪問http請求,並通過條件變數阻塞,新的執行緒發起http請求,若成功則發訊號條件變數告訴主執行緒,主執行緒即可返回。若超過時長限制還未返回,也告訴主執行緒。
未完待續
也歡迎關注公眾號,準備持續更新c++方面的相關知識 ~