4

ファイルを非同期で書き込みたい。ベクトルとファイル名を取り込んでファイルに送信する関数を持つクラスがあります。この関数は、クラスの外から数千回呼び出すことができます。

書き込み非同期を実行したい理由は...呼び出し元は書き込みを要求するだけでよく、それについて心配したり、書き込みが完了するのを待つ必要はありません。

私はソケット、TCPを使用していません...

私はブーストを調べています:: asio、例を見つけようとしています - 私が見つけることができるのは、ネットワーキングを使用する例だけです :

Boostを使用してデータ構造をシリアライズして送信しますか?

boost::asio async_read すべてのバイトが読み取られることを保証

もっと。

誰かがファイル i/o の例を提案できますか?

私が求めていることは理にかなっていますか?

4

1 に答える 1

7

非同期実装のオーバーヘッドを正当化するために、IO操作が十分に複雑であると仮定すると、あなたがやりたいことはまったく問題ないと思います。私の簡単な提案は次のようになります (古い質問からコピー):

#include <thread>
#include <functional>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

void io_operation(int parameter) {
   //Your stuff
}

int main ( int argc, char* argv[] ) {
    boost::asio::io_service io_service;
    boost::asio::io_service::work work(io_service);

    //Set up a thread pool taking asynchronically care of your orders
    std::vector<std::thread> threadPool;

    for(size_t t = 0; t < std::thread::hardware_concurrency(); t++){
        threadPool.push_back(std::thread(boost::bind(&boost::asio::io_service::run, &io_service)));
    }

    //Post an IO-operation
    io_service.post(std::bind(io_operation, 123));

    //Join all threads at the end
    io_service.stop();
    for(std::thread& t : threadPool) {
        t.join();
    }
}

C++11これは、スレッドを使用できることを前提としています。また、1 つのスレッドだけが特定のファイルに書き込んでいるとは限らないことに注意してください。したがって、特定のファイルの呼び出しが並行して処理されないようにするために、ストランドを使用する必要がある場合があります。

于 2013-05-21T00:44:22.783 に答える