多线程后的性能与顺序运行

时间:2017-03-17 12:03:13

标签: c++ multithreading boost boost-asio

我有一个程序可以多次运行这样的函数:

int main(){
    std::ifstream file(inFile);
    std::string input; 

    while(std::getline(file, input)){
         myFunction(input); 
    }


return 0; 
}

myFunction(std::string){
//some work 
}

我使用boost创建一个线程池来在多个线程上运行该函数,因为它们的行为非常适合这样的并行化:

 int main(){
    std::ifstream file(inFile);
    std::string input; 
     /*Creating the thread pool and intializing the threads*/
    boost::asio::io_service io_service;
    boost::asio::io_service::work work_(io_service);
    boost::thread_group threads;

    for (std::size_t i = 0; i < NUMTHREADS; ++i)
        threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));


    while(std::getline(file, input)){
    io_service.post(boost::bind(&myFunction, input));

    }
    io_service.stop();
    threads.join_all();

return 0; 
}

myFunction(std::string){
//some work 
}

我只添加了主要部分的代码片段。我得到了正确的输出,但这根本没有改善性能!我得到的运行时间与顺序运行相同。

我怀疑这些作业未正确提交到游泳池,但我该如何检查呢?

更新
我能够调查多个线程并检查工作是否正确提交,看起来每个线程都有自己的工作,但性能仍未改变。

1 个答案:

答案 0 :(得分:0)

如果您以同步方式从多个线程读取相同的文件(这是因为您正在使用std流),没有任何意义,因为所有文件读取调用都将由系统序列化(这就是系统如何处理文件)。

可能,如果您使用异步文件读取(如IO完成),它将帮助您获得性能(如果您的工作执行所花费的时间比读取文件要多得多)。

但是,请记住,如果您从文件中读取内容的有用工作与读取操作相当,您将无法获得任何收益(但管理线程需要额外的成本和复杂性) ,上下文切换和同步)因为系统会对您的IO请求进行排队,并且它们将以串行方式执行(除非您从多个不同的物理驱动器读取)。