這與this question有些相關,但我認爲我需要多瞭解一點。我一直在試着讓我的頭腦幾天(在其他部分工作的同時)如何做到這一點,但現在是時候讓我咬緊牙關並獲得多線程。而且,我比有關問題的信息多一點。boost :: asio,線程和同步
首先,關於多線程。由於我一直在測試我的代碼,所以我沒有爲任何多線程所困擾。它只是一個控制檯應用程序,它啓動與測試服務器的連接,然後處理所有其他事情。主循環是這樣的:
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
當我寫我的主要應用,我猜這個解決方案是不能接受的(因爲它會在消息循環中被調用哪個,雖然可能會有當消息隊列阻塞等待消息時,你可以改變它,這樣消息循環就不會阻塞,但是這不會阻止CPU使用率通過屋頂?)
解決方案它似乎是要拋出另一個線索。好的。但是當我沒有工作要做時,我已經讀了io_service::run()
。那是什麼?那是什麼時候沒有數據,或沒有連接?如果至少有一個連接存在,它會保持活着嗎?如果是這樣,這不是什麼大問題,因爲我只需要在第一次連接時創建一個新線程,並且我很高興如果一切都停止時就停止了。我想我對'沒有工作要做'的定義感到困惑。
然後我不得不擔心同步我的提升線程與我的主要GUI線程。所以,我想我的問題是:
- 在客戶端應用程序中使用boost :: asio關於線程並保持它們活着的最佳實踐方式是什麼?
- 當從主線程寫入套接字到IO線程時,是否使用
boost::asio::post
實現同步,以便稍後在io_service中發生該調用? - 當收到數據時,人們如何將數據返回到UI線程?在過去,當我使用完成端口時,我做了一個特殊的事件,可以使用:: SendMessage將數據發送回主UI線程。這不是優雅,但它的工作。
今天我會再讀一些,但如果能夠從已經完成這項工作的人那裏得到正面評價,那將是一件好事。 Boost :: asio文檔並不是很好,迄今爲止我的大部分工作都是基於一些文檔,一些試驗/錯誤以及網絡上的一些示例代碼。
+1 io_service :: work是我自己解決這個問題的方法。 – 2011-01-19 13:31:59
感謝您的回覆。當你說有幾種可能性時,過去你曾使用過什麼? – 2011-01-19 14:11:11