2010-10-19 456 views
1

我對優異的asio用於異步網絡客戶端。在處理讀取(async_read)時,我擔心處理數據的方法/函數可能會掛起或花費太長時間(函數由類的用戶提供)。C++事件處理

調用提供的功能的最佳方式是什麼,確保它不會花費太長時間?

謝謝你的時間。

回答

1

你可以寫這會打開一個單獨的線程給定的處理程序,並做就可以了timed_join的包裝功能。如果超時到達,你可以拋出異常或做任何你想要的。

+0

這非常有趣。我如何在另一個線程中啓動一個函數/方法? – nc3b 2010-10-19 19:50:53

+0

@ 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

+0

@Armen Tsirunyan:我能做到這一點,但產卵另一個線程接收到的每個數據包可能會有點性能的命中 – nc3b 2010-10-19 19:54:05

1

除非你的處理程序做的工作是非常短暫的(不太可能在現實世界的應用程序),你會希望有一個生產者/消費者隊列從您的I/O線(S),隨手關閉接收到的數據你的工作人員受到進一步處理,所以你可以儘快從你的處理程序返回。

有使用Boost.Thread here生產者/消費者底漆 - 由升壓線程庫目前筆者寫的,作爲獎勵。

+0

謝謝你,這看起來不錯:) – nc3b 2010-10-19 20:18:58

+1

@ nc3b - 我無法對Boost的這些部分說出足夠多的好話。 – 2010-10-19 20:21:52

1

一個額外的線程來處理回調處理是一個好主意。如上所述,讓您的回調將消息推送到線程安全隊列中,而另一個消耗/處理消息的線程工作得很好。

可能爲你工作的另一個線程的情況是剛剛開始。該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連接,那麼所有的賭注都關閉,因爲反正收到的消息順序無法得到保證。

+0

感謝您的建議,我最終選擇了生產者/消費者模式(因爲消息按順序處理)。 – nc3b 2010-10-23 22:14:48