2

私はブーストを使用しており、これが必要です:

// --- some random function ---
boost::asio::io_service io;
boost::asio::ip::tcp::socket sock;
char b[256];
// connect and stuff here
boost::asio::async_read( sock,
    boost::asio::buffer(b, 256),
    boost::bind( &onRead, _1, _2)
    );

と同じです

// --- some random function ---
boost::asio::io_service io;
boost::asio::ip::tcp::socket sock;
boost::thread *read_thread;
char b[256];
// connect and stuff here
read_thread = new boost::thread( 
    boost::bind( &boost::asio::io_service::run, &( io))
    );
io.post( &read, b, sock);


// --- read function
bool read( char b[], boost::asio::ip::tcp::socket sock){
    boost::asio::read( sock,
        boost::asio::buffer(b, 256),
        boost::bind( &onRead, _1, _2)
        );
}

非同期呼び出しで何が起こるのか、同期と何が違うのかを知りたいだけです。

編集: 私の主な質問は: 非同期呼び出しは、io_service にバインドされたスレッドをブロックしますか?

編集2:これで問題が解決しました: http://www.ibm.com/developerworks/linux/library/l-async/?ca=dgr-lnxw02aUsingPOISIXAIOAPI

4

1 に答える 1

3

同期呼び出しは、その作業を実行すると戻り、作業の結果は次のステートメントで使用できます。このような呼び出しは、 をブロックする可能性があります。

非同期呼び出しはすぐに戻りますが、作業の状態は不確定です。作業が完了すると、登録されたコールバック関数が ioservice によって呼び出され、そのサービスを別のスレッドで実行しているため、コールバックもその別のスレッドで実行されます。

非同期プログラミングは、制御フローに関してははるかに困難ですが、パフォーマンスに関してははるかに優れています。読み取りと書き込みがサーバーの進行中の操作の一部である場合は、ほとんどの場合、非同期モデルを使用する方が適切です (ただし、Boost ではなく、シングル スレッドである可能性があります)。一方、一度実行して一連の処理を行う単純なツールは、同期呼び出しを使用するだけで、記述と理解がより簡単で、操作の結果を待つ必要がある場合は違いがない可能性があります。とりあえず。

于 2013-01-05T11:43:50.467 に答える