Java 和 C++/Qt 中的线程差异
Difference in threads between in Java and in C++/Qt
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的正确方法是什么?(请举例...
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 将对象传递给多线程对象 Qt
- Qt 在另一个线程中无限循环
- 通过 Qt 中的线程调用 Rust 库
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- Qt::D irectConnection在多线程环境中使用时如何工作?
- 如何在Qt中合并/追加/添加两个用于线程的模型?
- 在 C++ 的 Qt 中使用 WINAPI 线程时出现问题
- Qt - 如何从线程创建 QFuture
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 谷歌语音识别不起作用,因为冲突线程Qt C++
- 信号/插槽多线程 Qt
- 无法在另一个线程-QT中向对象发送已发布的事件
- 无法为处于不同线程(Qt)中的父级创建子级
- 如何同时运行两个线程?Qt C++
- 多线程Qt应用程序在退出时不会停止
- 在单独的线程 Qt 中渲染屏幕外小部件
- 我如何在另一个线程Qt显示MessageBox