1. 程式人生 > 其它 >linux c++介面超時設計

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++方面的相關知識 ~

在這裡插入圖片描述