首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qDebug()线程安全吗?

qDebug()线程安全吗?
EN

Stack Overflow用户
提问于 2014-03-20 08:25:43
回答 7查看 7K关注 0票数 25

qDebug()线程安全吗?所谓线程安全,我不仅仅指的是崩溃,而且如果我从不同的线程调用qDebug(),是否有可能使输出发生混淆?我用这段代码对它进行了测试,但似乎并不是这样,但是,我在文档中找不到他们谈论这一点的地方。

这是我的测试代码:

代码语言:javascript
复制
#include <QtConcurrent>
#include <QApplication>
void print_a() {
    for (int ii = 0; ii < 10000; ii++) {
        qDebug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
    }
}
void print_b()
{
    for (int ii = 0; ii < 10000; ii++) {
        qDebug("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
    }
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtConcurrent::run(print_a);
    QtConcurrent::run(print_b);
    return a.exec();
}

没有'a‘和'b’混合在同一行任何地方,但我仍然不确定它是否100%线程安全.

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-04-30 00:05:03

以下是我的答覆和意见:

  1. 如果qDebug()的文档没有提到它是否是线程安全的,我们应该假设它不是。答案可能与平台有关: qDebug()是如何在系统级别(Linux、Windows、.)实现的。
  2. 与更广泛的线程安全问题不同,我认为您提出了一个更具体的问题:“在多线程应用程序中使用qDebug()会导致交错的输出行吗?”答案是“是的,偶尔。”如上面@dmcontador所产生的结果所示。当要打印的字符串越来越长时,概率就会增加,正如上面@quetzalcoatl所解释的那样。
  3. 答案并不取决于是否使用qDebug(“.”)或者qDebug() <<“.”,因为两者最终都将调用系统级实现代码。
  4. 使用原始示例代码生成交错的输出行对我来说并不容易。因此,我创建了一个新的示例,如下所示: #include # MAX_ITERS 10 #定义MAX_LEN 10000 void print_a() { QString a(MAX_LEN,'a');for(int i= 0;i< MAX_ITERS;++i) { qDebug().noquote() << a;}voidprint_b(){ QString b(MAX_LEN,'b');for(int i= 0;i< MAX_ITERS;++i){qDebug().noquote()<

当您增加MAX_LEN时,概率会增加。

  1. 接下来的一个问题是:“如何使用qDebug()生成非交错的输出行?”一种解决方案是在每个qDebug()行上使用qDebug。请注意,我没有尝试这个解决方案,这是不实际的。
票数 16
EN

Stack Overflow用户

发布于 2014-03-20 12:00:34

医生说是http://qt-project.org/doc/qt-5.0/qtcore/threads-reentrancy.html。如果是qDebug(),上面写着:Note: This function is thread-safe

(这个答复是最新的.)之前,docs没有声明该函数是线程安全的。)

票数 16
EN

Stack Overflow用户

发布于 2014-05-07 12:23:59

恐怕这不安全。此外,我尝试了您的代码,并有混合输出。

代码语言:javascript
复制
aaaaaaaaaaaabbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbb

我对qDebug() << "..."也有同样的运气

在Qt5.2.1中用mingw48_32编译器进行测试。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22527253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档