1. 程式人生 > 實用技巧 >協程卡死的一種情況

協程卡死的一種情況

在使用 libco 的時候,不正確的用法會導致協程排程不正常。分享最近遇到的問題。

在協程環境下,呼叫了使用標準鎖的函式。

RPC 框架是一個多執行緒多協程的模型,在一個執行緒下會開啟多個協程,請求來了之後會由協程呼叫業務處理函式。最近加了一個併發優化後,發現會出現請求卡住不呼應的問題。

最終定位到就是:在協程環境下使用了std::mutex,併發的 RPC 請求可能會呼叫到同一個執行緒的兩個協程內。我們稱這兩個協程為 A 和 B。第一個請求時,A 協程拿了鎖,然後向另外一個服務傳送了網路請求。這個時候協程A因為IO被掛起,切換到協程B,協程B又嘗試對mutex加鎖。同一個執行緒下兩次呼叫,這個協程B就永遠卡死了。因為協程B一直卡著,協程A也沒辦法被排程回來。現象上看,這個處理執行緒完全卡死,兩個請求不響應。

解決辦法就是使用協程自帶的鎖,避免執行緒級的鎖。