Java 和 C++/Qt 中的线程差异

Difference in threads between in Java and in C++/Qt

本文关键字:线程 Qt C++ Java      更新时间:2023-10-16

java版本完全按预期工作,而C++版本崩溃。当 1 <= N_THREADS <= 2 时,C++ 版本以某种方式起作用,但否则它会失败。

我已经挣扎了几个小时,试图使C++版本正常工作,但失败了,仍然不知道发生了什么。当然,我会通过研究系统线程和 Qthread 源代码来了解问题所在,是的,我会尝试这样做,但我现在也需要一个解决方案。

任何帮助表示赞赏。

thread_test.java

class my_thread extends Thread
{
    int n;
    my_thread()
    {
        n = 0;
    }
    public void run()
    {
        try
        {
            while (n < 10)
            {
                System.out.print(n++);
                Thread.sleep(1000);
            }
        }
        catch (InterruptedException e)
        {
            return;
        }
    }
}
public class thread_test
{
    public static void main(String[] args)
    {
        final int N_THREADS = 10;
        for (int i = 0; i < N_THREADS; i++)
        {
            new my_thread().start();
        }
    }
}

thread_test.cpp

#include <array>
#include <QTextStream>
#include <QThread>
QTextStream qout(stdout);
class my_thread : public QThread
{
public:
    int n;
    my_thread()
    {
        n = 0;
    }
    void run()
    {
        while(n < 10)
        {
            qout << n++ << flush;
            msleep(1000);
        }
    }
};
int main()
{
    enum { N_THREADS = 10 };
    std::array<my_thread, N_THREADS> thread_array;
    for (auto& thread : thread_array)
    {
        thread.start();
    }
    for (auto& thread : thread_array)
    {
        thread.wait();
    }
    return 0;
}

编辑

阅读评论和一些 Google 搜索,我的C++代码中的问题肯定是在多个线程中使用非线程安全操作。所以在这里,我的问题将通过使QTextStream线程安全来解决,就像Java的PrintStream一样。

根据我的快速网络搜索,我有点猜测 QTextStream 与标准输出交互的过程不应该同时通过多个线程完成,因为只有一个标准输出。但是,在一个线程与标准输出交互期间让所有其他线程等待太慢了。所以我认为正确的解决方案是建立一个队列来存储要写入的输出,作为 QString 引用,而 stdout 很忙,无法同时接受更多任务。那么,在这里我如何保证这个队列是线程安全的呢?我现在很困惑。另外,Java PrintStream 是如何实现为线程安全的?请帮助我组织这些问题并找到解决此问题的正确方法。

Qt中,您不应该派生QThread,因为您想要functionality run in a thread而不是thread having that functionality

只要看看这些链接,第一个描述线程更通用,第二个帮助实现。

https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong

实现QThread的正确方法是什么?(请举例...