关于C++ 里使用Openmp并行之cout混乱输出的解决方法

#pragma omp parallel
    {
#pragma omp for
        for(int i=0;i<10;++i)
            std::cout<


很多技术书籍里面,Openmp实例都是用C写的,可很多用户在自己练习的时候都喜欢用自己熟悉的语言,比如鄙人喜欢用C++,这样容易找到对象~~。于是在最简单的输出问题上遇到这样一个差异。请看上面代码。

首先是C的运行结果:


好吧,这正是我们所想要的。

如果你用C++里面的cout输入是什么情况呢,请看




数字和换行彻底混乱了,屎一样的结果,no fashion.

技术宅拯救世界,让我们看看如何用C++得到想要的结果吧。闲言少叙,直接代码上。

//

#include 
#include 
#include 
/**
* 这个类是用来在openmp环境下输出std::cout内容的。
*/
class Cout_MP{
private:
    // Buffer
    std::ostringstream oss;
    // private constructor
    Cout_MP(): oss(std::ostringstream::out){
    }
public:
    // to get a printer
    static Cout_MP Print(){
        return Cout_MP();
    }
    // for all types (except Action)
    template 
    Cout_MP& operator<<(const T& input){
        oss << input;
        return *this;
    }
    // actions
    enum Action{
        ENDL,
        PRINT,
    };
    // for action type
    Cout_MP& operator<<(const Action& input){
        switch(input){
            // endl => append \n
            case ENDL:{
                oss << "\n";
                      }
                      // endl or print => print
            case PRINT:{
                std::cout << oss.str();
                std::cout.flush();
                oss.clear();
                       }break;
        }
        return *this;
    }
};
// Example
int main()
{
    std::cout << "Basic std::cout" << std::endl;
#pragma omp parallel num_threads(4)
    {
        std::cout << "I want " << "to print many " << "things " << "thread : " << omp_get_thread_num() << std::endl;
    }
    std::cout << "With Cout_MP" << std::endl;
#pragma omp parallel num_threads(4)
    {
        Cout_MP::Print() << "I want " << "to print many " << "things " << "thread : " << omp_get_thread_num() << Cout_MP::ENDL;
    }
    return 0;
}

请看运行结果:



欢呼吧,技术宅!

你可能感兴趣的:(OPENMP,beauty,c++,parallel,thread,action,input)