web-dev-qa-db-ja.com

なぜboost :: asio :: io_service :: workを使用する必要があるのですか?

Boost :: asioの使用例があります。

  1. この例でboost :: asio :: io_service :: workを使用するのはなぜですか?
  2. そして、なぜスレッドでタスクを実行するためにsrv.run ();が呼び出されないのですか?
int main()
{
    boost::asio::io_service srv;
    boost::asio::io_service::work work(srv);
    boost::thread_group thr_grp;
    thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv));
    thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv));

    srv.post(boost::bind(f1, 123));
    srv.post(boost::bind(f1, 321));
    //sync

    srv.post(boost::bind(f2, 456));
    srv.post(boost::bind(f2, 654));
    //sync

    srv.stop();
    thr_grp.join();
}

pdate: io_service :: workなしでio_serviceを使用した場合、ポーリングと実行の違いは何ですか?

int main()
{
    boost::asio::io_service srv;
    //boost::asio::io_service::work work(srv);
    std::vector<boost::thread> thr_grp;

    srv.post(boost::bind(f1, 123));
    srv.post(boost::bind(f1, 321));
    //sync

    srv.post(boost::bind(f2, 456));
    srv.post(boost::bind(f2, 654));
    //sync

    // What is the difference between the poll and run, when io_service without work?
    thr_grp.emplace_back(boost::bind(&boost::asio::io_service::poll, &srv));// poll or run?
    thr_grp.emplace_back(boost::bind(&boost::asio::io_service::run, &srv));// poll or run? 

    srv.stop();
    for(auto &i : thr_grp) i.join();

    int b;
    std::cin >> b;

    return 0;
}
19
Alex

Io_service :: runメソッドが作業オブジェクトなしで呼び出されると、すぐに戻ります。通常、これはほとんどの開発者が求めている動作ではありません。もちろん、いくつかの例外はありますが、ほとんどの開発者は、すべての非同期処理を処理するスレッドを指定しようとしています。それがあなたのコード例がすることです。

Io_service :: runメソッドは、create_threadメソッドでデリゲートまたは関数ポインターとして指定されます。そのため、スレッドがcreate_threadメソッドから作成されると、io_service :: runメソッドが呼び出され、io_serviceオブジェクトが引数として渡されます。通常、1つのio_serviceオブジェクトを複数のソケットオブジェクトで使用できます。

通常、stopメソッドは、アプリケーションをシャットダウンするとき、またはすべてのクライアント/サーバー間の通信が不要になり、新しい接続を開始する必要がない場合に呼び出されます。

20
Bob Bryan