作為Boost.Asio的初學者,我對感到困惑io_service::run()。如果有人可以向我解釋此方法的阻止/解除阻止,我將不勝感激。文檔指出:該run()函數將阻塞,直到所有工作完成并且不再有要分派的處理程序,或者直到io_service停止為止。多個線程可以調用該run()函數來建立線程池,線程池io_service可以從中執行處理程序。池中等待的所有線程都是等效的,并且io_service可以選擇其中任何一個來調用處理程序。從該run()函數正常退出意味著該io_service對象已停止(該stopped()函數返回true)。后續調用run(),run_one(),poll()或poll_one()將除非有預先調用立即返回reset()。以下陳述是什么意思?[...]不再派遣處理程序[...]在嘗試了解的行為時io_service::run(),我遇到了這個示例(示例3a)。在其中,我觀察到這些io_service->run()障礙并等待工作指令。// WorkerThread invines io_service->run()void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service);void CalculateFib(size_t);boost::shared_ptr<boost::asio::io_service> io_service( new boost::asio::io_service);boost::shared_ptr<boost::asio::io_service::work> work( new boost::asio::io_service::work(*io_service));// ...boost::thread_group worker_threads;for(int x = 0; x < 2; ++x){ worker_threads.create_thread(boost::bind(&WorkerThread, io_service));}io_service->post( boost::bind(CalculateFib, 3));io_service->post( boost::bind(CalculateFib, 4));io_service->post( boost::bind(CalculateFib, 5));work.reset();worker_threads.join_all();但是,在我正在處理的以下代碼中,客戶端使用TCP / IP連接,并且run方法將阻塞,直到異步接收數據為止。typedef boost::asio::ip::tcp tcp;boost::shared_ptr<boost::asio::io_service> io_service( new boost::asio::io_service);boost::shared_ptr<tcp::socket> socket(new tcp::socket(*io_service));// Connect to 127.0.0.1:9100.tcp::resolver resolver(*io_service);tcp::resolver::query query("127.0.0.1", boost::lexical_cast< std::string >(9100));tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);socket->connect(endpoint_iterator->endpoint());// Just blocks here until a message is received.socket->async_receive(boost::asio::buffer(buf_client, 3000), 0, ClientReceiveEvent);io_service->run();// Write response.boost::system::error_code ignored_error;std::cout << "Sending message \n";boost::asio::write(*socket, boost::asio::buffer("some data"), ignored_error);run()在下面的兩個示例中對其描述其行為的任何解釋將不勝感激。
3 回答

冉冉說
TA貢獻1877條經驗 獲得超1個贊
為了簡化run
操作,將其視為必須處理一堆紙的員工;它需要一張紙,執行紙頁上告訴的內容,將紙頁扔掉并拿下另一張紙;當他的床單用完時,它離開了辦公室。在每張紙上可以有任何種類的說明,甚至可以在堆中添加一張新紙。回到ASIO:你可以給一個io_service
使用:工作有兩種方式,本質上post
,或者通過使用內部調用其他對象就可以了,你掛在樣品中post
的io_service
一樣,socket
和它的async_*
方法。

精慕HU
TA貢獻1845條經驗 獲得超8個贊
可以io_service.poll()
用來處理事件循環,而不會阻塞未完成的操作。避免混合同步操作和異步操作的主要建議是避免增加不必要的復雜性,并在處理程序需要很長時間才能完成時防止響應性差。在某些情況下它是安全的,例如當您知道同步操作不會阻塞時。
- 3 回答
- 0 關注
- 726 瀏覽
添加回答
舉報
0/150
提交
取消