亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當boost :: asio :: io_service運行方法阻塞/取消阻塞時感到困惑

當boost :: asio :: io_service運行方法阻塞/取消阻塞時感到困惑

C++
jeck貓 2019-12-10 13:08:41
作為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,或者通過使用內部調用其他對象就可以了,你掛在樣品中postio_service一樣,socket和它的async_*方法。

查看完整回答
反對 回復 2019-12-11
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

可以io_service.poll()用來處理事件循環,而不會阻塞未完成的操作。避免混合同步操作和異步操作的主要建議是避免增加不必要的復雜性,并在處理程序需要很長時間才能完成時防止響應性差。在某些情況下它是安全的,例如當您知道同步操作不會阻塞時。

查看完整回答
反對 回復 2019-12-11
  • 3 回答
  • 0 關注
  • 726 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號