簡體   English   中英

Boost asio io_service 運行異常並從多個線程重新啟動

[英]Boost asio io_service run exception adn restart from multiple threads

我想知道在來自多個線程的 io_context 上使用 boost asio 的 run() 函數時在處理函數中拋出異常時會發生什么。 我在 io_context 上調用 run 操作的線程函數如下所示:

while(!io->stopped() && *stop == false) {
    try {
        auto cnt = io->run();
    }catch(std::exception &e) {
        
    }

    if(io->stopped()) {
        break;
    }
}

線程數為1..N。 文檔指出,對 run() 的任何后續調用都必須先調用 restart() 但當仍有對 run() 的任何活動調用時不得調用 restart() 我不知道,因為可能仍有線程在調用 run ()。

當只有一個 io_context 和許多線程調用 run() 時,有什么解決方案

你是對的,你需要捕捉/處理異常。

解決您的難題的方法非常簡單:實際上不應在循環中調用run() 這種認識很有幫助,因為它讓您意識到一旦run(); 正常退出,你可以隨時break; .

更籠統地說,您還可以檢查run/poll{*}成員函數的返回值:如果它返回零,則表示服務無法工作。

正常退出run 需要調用重新啟動,以便后續調用run不會立即返回。 拋出異常不是正常的退出,所以立即再次調用run是可以的。

您的代碼可能只是:

while(true) {
    try {
        auto cnt = io->run();
        break;
    }catch(std::exception &e) {
        
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM