模型執行緒

標示為 oneway 的方法不會封鎖。未標示為 oneway,用戶端的方法呼叫會封鎖,直到伺服器 完成執行或稱為同步回呼 (兩者取其先)。 伺服器方法實作最多只能呼叫一個同步回呼;額外 系統會捨棄回呼呼叫並記錄為錯誤。如果每個方法 ,且不呼叫其回呼,此動作會記錄為 錯誤並回報為傳輸錯誤。

直通模式中的執行緒

在直通模式中,大多數呼叫都是同步的。不過,為了保留 oneway 呼叫不會封鎖用戶端, 系統會為每個程序建立執行緒詳情請參閱 HIDL 總覽

繫結化 HAL 中的執行緒

為了提供傳入的 RPC 呼叫 (包括從 HAL 到 HAL 使用者) 和死亡通知,執行緒集區會與各個程序相關聯 都採用 HIDL如果單一處理程序實作多個 HIDL 介面,且/或 所有死亡通知處理常式會共用其執行緒集區。時間 處理程序收到用戶端傳入的方法呼叫後,就會挑選一個免費的執行緒 從執行緒集區擷取,並在該執行緒上執行呼叫。如果沒有免費討論串為 就會受到封鎖,直到有可用時為止

如果伺服器只有一個執行緒,則會完成對伺服器的呼叫 順序。擁有多個執行緒的伺服器可能會依序完成呼叫 即使用戶端只有一個執行緒不過,對於指定的介面物件 oneway 的通話保證會訂購 (參閱 伺服器執行緒模型)。適用於 代管多個介面,oneway 呼叫不同介面 都可能會與彼此或其他造成阻斷的呼叫同時處理。

在同一個 Hwbinder 執行緒上傳送多個巢狀呼叫。舉例來說: 如果程序 (A) 從 hwbinder 執行緒執行同步呼叫並進入處理程序 (B), 然後處理 (B) 對程序 (A) 進行同步呼叫, 在 (A) 中對原始 hwbinder 執行緒所執行,但對原始 hwbinder 執行緒進行封鎖 呼叫。這項最佳化功能可讓單一執行緒伺服器 可處理巢狀呼叫,但不適用於呼叫 其他序列處理序間通訊 (IPC) 呼叫例如,如果程序 (B) 繫結器/vndbinder 呼叫,然後呼叫處理程序 (C),然後再處理 (C) 呼叫 返回 (A) 後,就無法在 (A) 中的原始執行緒放送。

伺服器執行緒模型

除了直通模式外,HIDL 介面的伺服器實作項目除外 這個程序與用戶端不同,需要一或多個執行緒等待 傳入方法呼叫這些執行緒是伺服器的執行緒集區;讓伺服器可以 決定執行緒集區中要執行的執行緒數量,以及可使用 執行緒大小,用來將介面上的所有呼叫序列化。如果伺服器 在執行緒集區中有多個執行緒,這個執行緒可以接收並行傳入 呼叫 (在 C++ 中,表示共用資料必須在 然後鎖定)。

系統會將對相同介面的單向呼叫序列化。如果多執行緒 用戶端在介面上呼叫 method1method2 IFoomethod3介面IBarmethod1method2 一律會序列化,但 method3 可與 method1method2

執行單一用戶端執行緒可能會導致並行在 多個執行緒,以兩種方式:

  • oneway 通話不會封鎖。如果 oneway 呼叫 然後呼叫非 oneway 後,伺服器便可執行 oneway 呼叫和非 oneway 呼叫 。
  • 使用同步回呼傳回資料的伺服器方法可以解除封鎖 用戶端就會立即呼叫用戶端。

至於第二種做法,則在伺服器函式中,針對在 呼叫回呼的方式可以並行執行,而伺服器後續會處理 呼叫。這包括伺服器函式中的程式碼 在函式結尾執行的解構函式。如果伺服器的 執行緒集區的一個執行緒,即使呼叫來自其他執行緒,仍會發生並行問題 只會擷取來自單一用戶端的回應(如果某程序需要處理的任何 HAL 多個執行緒,所有 HAL 都有多個執行緒,因為執行緒集區 每個程序共用)。

一旦伺服器呼叫提供的回呼,傳輸元件便可立即呼叫 在用戶端上實作回呼,並解除封鎖用戶端。用戶端繼續操作 同時,伺服器實作在呼叫 回呼 (可能包含執行中的解構函式)。伺服器函式中的程式碼 ,在回呼不再封鎖用戶端後 (只要 執行緒集區的執行緒足以處理來電,但可能會執行 與之後用戶端的呼叫同時執行 (除非伺服器執行緒集區 只有一個討論串)。

除了同步回呼外,oneway 也會從 單一執行緒用戶端最多可由含有多個 執行緒集區中的執行緒,但這些 oneway 呼叫 在不同介面上執行oneway 通話 (來自相同裝置) 介面一律會序列化。

注意:強烈建議您使用伺服器函式完成以下工作: 就會立即傳回。

例如 (在 C++ 中):

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    // At this point, the client's callback is called,
    // and the client resumes execution.
    ...
    return Void(); // is basically a no-op
};

用戶端執行緒模型

用戶端上各非阻斷呼叫的執行緒模型有何不同 (標示 oneway 關鍵字的函式) 並封鎖 呼叫 (不含指定 oneway 關鍵字的函式)。

封鎖來電

針對封鎖呼叫,用戶端會保持封鎖,直到發生下列任一情況為止:

  • 發生傳輸錯誤;Return 物件包含錯誤 狀態,且可使用 Return::isOk() 擷取。
  • 伺服器實作會呼叫回呼 (如果有的話)。
  • 伺服器實作會傳回一個值 (如果沒有回呼參數)。

如果成功的話,用戶端會傳遞做為引數的回呼函式為 一律會在函式本身傳回之前由伺服器呼叫。回呼為 會在發出函式呼叫的執行緒上執行,因此實作者 請務必在函式呼叫期間保留鎖定,並避免 以上皆是)不含 generates 陳述式的函式 或 oneway 關鍵字仍在封鎖中;用戶端封鎖功能,直到 伺服器會傳回 Return<void> 物件。

單向通話

當函式標示為 oneway 時,用戶端會立即傳回內容 :不需要等待伺服器完成其函式呼叫叫用。在 介面 (且匯總),這表示函式呼叫 因為這只執行一半程式碼,但在編寫實作時 與效能相關,這對排程作業產生了影響。一般情況下 使用單向呼叫會導致呼叫端持續排程,而 如果使用一般同步呼叫,排程器就會立即 資料。這是 繫結器。必須在目標程序中執行單向呼叫的服務 優先順序高,可以為接收服務設定排程政策 已變更。在 C++ 中,使用 libhidltransport 方法 含有排程器優先順序和政策的 setMinSchedulerPolicysched.h 中定義的定義,可確保服務的所有呼叫都會在 至少應設定排程政策和優先順序