協程卡死的一種情況

2022-08-21 11:39:10 字數 426 閱讀 9909

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

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

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

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

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

一種協程的 C C 實現

在前幾天接觸到了協程的概念,覺得很有趣。因為我可以使用乙個執行緒來實現乙個類似多執行緒的程式,如果使用協程來替代執行緒,就可以省去很多原子操作和記憶體柵欄的麻煩,大大減少與執行緒同步相關的系統呼叫。因為我只有乙個執行緒,而且協程之間的切換是可以由函式自己決定的。我有見過幾種協程的實現,因為沒有 c ...

年輕人會用C 實現一種協程嗎?

前言 在前幾天接觸到了協程的概念,覺得很有趣。因為我可以使用乙個執行緒來實現乙個類似多執行緒的程式,如果使用協程來替代執行緒,就可以省去很多原子操作和記憶體柵欄的麻煩,大大減少與執行緒同步相關的系統呼叫。因為我只有乙個執行緒,而且協程之間的切換是可以由函式自己決定的。我有見過幾種協程的實現,因為沒有...

協程的活學活用(一)

之前寫協程的時候偶爾會遇到一些物體被關了沒有啟用,掛載上面的指令碼開啟的協程也不執行了。為了徹底解決這個問題,我聽取同事建議寫了這個工具指令碼,當然你也可以嘗試協程單例或者其他模式的。主要目的就是讓協程都在乙個固定不刪除的物體上同一開啟和停止。namespace toolsbylm private ...