我對優異的asio
用於異步網絡客戶端。在處理讀取(async_read
)時,我擔心處理數據的方法/函數可能會掛起或花費太長時間(函數由類的用戶提供)。C++事件處理
調用提供的功能和的最佳方式是什麼,確保它不會花費太長時間?
謝謝你的時間。
我對優異的asio
用於異步網絡客戶端。在處理讀取(async_read
)時,我擔心處理數據的方法/函數可能會掛起或花費太長時間(函數由類的用戶提供)。C++事件處理
調用提供的功能和的最佳方式是什麼,確保它不會花費太長時間?
謝謝你的時間。
你可以寫這會打開一個單獨的線程給定的處理程序,並做就可以了timed_join的包裝功能。如果超時到達,你可以拋出異常或做任何你想要的。
增強文檔提供了幾個示例,描述了您想要完成的任務。
http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/examples.html
外觀下的標題爲的例子超時。
你能更具體嗎?我很興奮,一點點的指導會幫助很多。 – nc3b 2010-10-19 19:55:11
一個額外的線程來處理回調處理是一個好主意。如上所述,讓您的回調將消息推送到線程安全隊列中,而另一個消耗/處理消息的線程工作得很好。
可能爲你工作的另一個線程的情況是剛剛開始。該io_service額外的線程。這些額外的線程可以同時處理多個處理程序。
const int max_threads = 5;
boost::asio::io_service ios;
boost::thread_group thread_group;
for (int i = 0 ; i < max_threads; ++i)
thread_group.create_thread(boost::bind(&boost::asio::io_service::run, boost::ref(ios)));
正確的解決方案實際上取決於應用程序在做什麼。如果這是一個TCP連接,並且消息需要按順序處理,請考慮使用生產者/消費者隊列。如果這些消息是相互獨立的,並且不需要它們按順序處理,那麼這種方法也適用。
如果UDP連接,那麼所有的賭注都關閉,因爲反正收到的消息順序無法得到保證。
感謝您的建議,我最終選擇了生產者/消費者模式(因爲消息按順序處理)。 – nc3b 2010-10-23 22:14:48
這非常有趣。我如何在另一個線程中啓動一個函數/方法? – nc3b 2010-10-19 19:50:53
@ nc3b:你創建一個boost :: thread類的實例(http://www.boost.org/doc/libs/1_44_0/doc/html/thread.html)並傳遞函數/方法作爲參數。上述timed_join是boost :: thread類的成員。 – 2010-10-19 19:52:35
@Armen Tsirunyan:我能做到這一點,但產卵另一個線程接收到的每個數據包可能會有點性能的命中 – nc3b 2010-10-19 19:54:05