我不明白为什么使用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();
}
答案 0 :(得分:1)
您的互斥锁无法正常运行。
mutex m;
lock_guard<mutex> guard(m);
每次调用shared_print时,都会创建一个不同的互斥锁。互斥体需要存在于函数外部,以便每个线程锁定它,而不是像现在一样每次都创建一个新的。