全局流的保护保护似乎不起作用

时间:2017-03-12 03:15:42

标签: c++11

我不明白为什么使用cout的代码似乎不起作用。控制台输出似乎每隔一段时间就会出现乱码。如果我用Qt库(LOCAL到shared_print函数)创建一个LOCAL控制台流,代码工作正常。我不知道如何制作一个本地块作用域cout,这就是我在示例中使用Qt控制台流作为概念证明的原因。

非常有趣的是,cout示例不起作用,因为我认为我谨慎使用cout应该避免在这个特定代码中的竞争条件。我意识到,如果某些东西是全球性的,那么全局的任何和所有用途都必须得到保护......所以在这个例子中,人们会认为所有使用它的方法都是有效的,但是没有...

#include <QCoreApplication>
#include <iostream>
#include <QTextStream>
#include <thread>                       //C++11 Threading
#include <mutex>                        //Using to get sane console output by avoiding race condition
#include <chrono>                       //Using for timer
#include <sstream>                      //Used to convert thread::id to string

using namespace std;

void shared_print(string s, thread::id id = thread::id(777))
{
    mutex m;
    lock_guard<mutex> guard(m);
    //QTextStream out(stdout);          //WORKS but std::cout doesn't
    stringstream ss;

    ss << id;

    // WORKS
    //if(id != thread::id(777))
    //  out <<  QString::fromStdString(s) << QString::fromStdString(ss.str()) << endl;
    //else
    //  out << QString::fromStdString(s) << endl;

    //DOES NOT WROK
    if(id != thread::id(777))
        cout <<  s << ss.str() << endl;
    else
       cout << s << endl;
}

void func1(int x){
    for(int i = 0; i < 20; i++){
         shared_print("FromThread:" + to_string(x) + " Function:func1" + " ID:" , std::this_thread::get_id() );
    }

}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    vector<thread> workers;
    unsigned int numWorkers = std::thread::hardware_concurrency();
    for (unsigned int i = 1; i <= numWorkers; i++) {
        workers.push_back( thread(func1, i) );
    }

//    shared_print("FromMainThread pre join() :: No. of threads C++ recomends: " +  to_string(std::thread::hardware_concurrency()) );
//    shared_print("FromMainThread pre join() :: ID of main Thread   = " , std::this_thread::get_id() );


    for (auto& worker : workers) {          
        if(worker.joinable())               
            worker.join();
    }

    shared_print("main thread post join()");     


    return a.exec();
}

1 个答案:

答案 0 :(得分:1)

您的互斥锁无法正常运行。

    mutex m;
    lock_guard<mutex> guard(m);

每次调用shared_print时,都会创建一个不同的互斥锁。互斥体需要存在于函数外部,以便每个线程锁定它,而不是像现在一样每次都创建一个新的。