簡體   English   中英

當io_service被線程化時,Boost.Asio中的異常處理

[英]Exception handling in Boost.Asio when io_service is threaded

如果一個應用程序只有一個io_service對象並且是有線程的(參見下面的代碼),那么如果其中一個異步處理程序拋出異常會發生什么。 它是如何傳播的,更重要的是它是處理它們的最佳方式。

std::list< boost::shared_ptr< the_client > > clients_list;
for(int i = 0; i < n_threads; i++)
{
    clients_list.insert(boost::make_shared< the_client >( io_service, server_host, server_port ));
}

for(unsigned int i = 0; i < n_threads; i++)
{
    threads.create_thread(boost::bind(&boost::asio::io_service::run, boost::ref(io_service)));
}

for(std::list< boost::shared_ptr< the_client > >::iterator itr = clients_list.begin(); itr != clients_list.end(); ++itr)
{
    (*itr)->connect_to_server_and_run_statemachine();
}

這里, the_client::connect_to_server_and_run_statemachine()設置與服務器的連接並啟動異步連接處理。

我知道關於類似主題的問題 ,但是這不考慮多線程io_service場景。

沒有什么神奇的事情發生。 如果你在某個地方捕獲異常,那么你的catch塊會處理它。 否則,未捕獲的異常將終止該進程。

你應該如何處理它取決於你想要發生什么。 如果異常永遠不會發生,那么讓它終止進程。 如果你想吃或處理異常,那么編寫一個在try / catch塊中包裝io_service::run並讓線程運行的函數。

我不喜歡把遠離代碼的情報放在一邊。 我首選的解決方案是永遠不要讓我的異步函數拋出異常,除非有一個真正致命的錯誤。 如果異步函數知道如何處理它可能拋出的異常,那么它應該捕獲它。

但是,如果在您的應用程序中有意義,那么將run包裝完全是可以接受的。

暫無
暫無

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

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