Synchronizing STD cout output multi-thread

前端 未结 5 1180
梦毁少年i
梦毁少年i 2020-12-15 10:21

Latelly I\'ve been working with multi-thread coding, after a while writing I realized that if I used std::cout in different boost::threads, the output would came without a l

5条回答
  •  悲哀的现实
    2020-12-15 11:00

    First of all, you might consider avoiding all the explicit thread management, and instead use std::async to launch your tasks in some arbitrary number of separate threads.

    Second, instead of doing the I/O in the threads themselves, you want to create results, and do the output itself serially. This means the thread function just creates some data, and leaves it to the caller to actually write that out:

    std::string process(int value) {
         std::ostringstream buffer;
         buffer << "my" << std::setfill('0') << std::setw(2) << value;
         return buffer.str();
    }
    

    Then we need to launch four copies of that asychronously:

    std::vector > results;
    
    for (int i=0; i<4; i++)
        results.push_back(std::async(std::launch::async, process, i));
    

    Then we get the results and print them out in order:

    for (auto &r : results)
        std::cout << r.get() << "\n";
    

    Putting those together, we could get code like this:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    std::string process(int value) {
         std::ostringstream buffer;
         buffer << "my" << std::setfill('0') << std::setw(2) << value;
         return buffer.str();
    }
    
    int main() { 
        std::vector> rets;
    
        for (int i=0; i<4; i++)
            rets.push_back(std::async(std::launch::async, process, i));
    
        for (auto & t : rets) {
            t.wait();
            std::cout << t.get() << "\n";
        }
    }
    

    I should add one minor point: I'm basing this on standard C++11 futures. I believe the basic idea should also work with Boost futures (upon which the standard was based) but I haven't tested that. I'd expect that some minor adjustments (e.g., to names) will be needed to work with Boost's futures.

提交回复
热议问题