提升asio写入文件

时间:2013-05-21 00:36:14

标签: c++ boost file-io boost-asio

我想异步写文件。我有一个带有一个函数的类,它接受一个向量和文件名,然后将它发送到文件中。这个函数可以从类外调用几千个时间。

我想要执行write async的原因是...调用者可以只是请求写入,然后不必担心它或等待写入完成。

我没有使用套接字,tcp ......

我正在调查boost :: asio,尝试查找示例 - 我能找到的只是使用网络的示例: http://liveworkspace.org/code/3R3RUd%240

Serialize and send a data structure using Boost?

boost::asio async_read guarantee all bytes are read

还有更多。

有人可以为文件i / o建议一个例子吗?

我的要求是否有意义?

1 个答案:

答案 0 :(得分:7)

我认为你想做的事情是完全没问题的,假设你的IO操作足够复杂,以便只是异步实现的开销。我的简单建议看起来像这样(从旧question复制):

#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个线程。此外,您应该知道,这不能确保只有一个线程正在写入特定文件。因此,您可能需要使用strands来确保不对特定文件的调用进行处理  平行。