gpt4 book ai didi

c++ - qDebug() 线程安全吗?

转载 作者:IT老高 更新时间:2023-10-28 12:56:19 29 4
gpt4 key购买 nike

qDebug() 是线程安全的吗?我所说的线程安全不仅仅是指不崩溃,而且如果我从不同的线程调用 qDebug() ,输出是否可能会混淆?我用这段代码对其进行了测试,但似乎并非如此,但是,我在他们谈论这个的文档中找不到任何地方。

这是我的测试代码:

#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% 线程安全...

最佳答案

以下是我的回答和评论:

  1. 如果 qDebug() 的文档没有提到它是否是线程安全的,我们应该假设它不是。答案可能取决于平台:如何在系统级别(Linux、Windows 等)实现 qDebug()。

  2. 我认为您不是在问更广泛的线程安全问题,而是像这样更具体的问题:“在多线程应用程序中使用 qDebug() 会导致交错的输出行吗?”答案是“是的,偶尔”。正如上面@dmcontador 产生的结果所证明的那样。当要打印的字符串变长时,概率会增加,正如上面@quetzalcoatl 所解释的那样。

  3. 答案并不取决于你是使用qDebug("...")还是qDebug() << "...",因为两者最终都会调用系统级的实现代码。

  4. 使用您的原始示例代码生成交错输出行对我来说并不容易。所以我创建了一个新示例,如下所示:

    #include <QCoreApplication>
    #include <QtConcurrent>

    #define MAX_ITERS 10
    #define MAX_LEN 10000

    void print_a()
    {
    QString a(MAX_LEN, 'a');

    for(int i = 0; i < MAX_ITERS; ++i) {
    qDebug().noquote() << a;
    }
    }

    void print_b()
    {
    QString b(MAX_LEN, 'b');

    for(int i = 0; i < MAX_ITERS; ++i) {
    qDebug().noquote() << b;
    }
    }

    int main(int argc, char * argv[])
    {
    QCoreApplication a(argc, argv);
    QtConcurrent::run(print_a);
    QtConcurrent::run(print_b);
    return 0;
    }

增加 MAX_LEN 时概率会增加。

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

关于c++ - qDebug() 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527253/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com