试图解决 QThread 的问题

Posted

技术标签:

【中文标题】试图解决 QThread 的问题【英文标题】:Trying to get problems with QThread 【发布时间】:2011-05-21 19:58:52 【问题描述】:

大家好,我正在学习 Qt,我已经上了 QThread 课程。由于没有多线程方面的经验,我花了几个小时研究 Win32API 中的信号量、互斥体、临界区和等待函数。当我在那里启动几个线程并且 ++ 或 -- 一个没有同步的全局变量时,我每次都得到不同的结果。现在我正在尝试对 QThread 做同样的事情,但我失败了。你能告诉我有什么问题吗?这是我的代码:

#include <QCoreApplication>
#include <QMutex>
#include <QSemaphore>
#include <QThread>
#include <cstdio>

static const int N = 2000000;

class Thread : public QThread 
public:
    Thread();
    void run();
private:
    static QMutex mutex;
;

QMutex Thread::mutex;
static int g_counter = 0;

int main(int argc, char *argv[]) 
    QCoreApplication app(argc, argv);
    Thread A, B, C;
    A.run();
    B.run();
    C.run();
    char c;
    scanf("%c", &c);
    printf("%d\n", g_counter);
    return app.exec();


Thread::Thread() 



void Thread::run() 
    //QMutexLocker lock(&mutex);
    for (int i = 0; i < N; ++i) 
        ++g_counter;
        --g_counter;
    

我希望看到 g_counter 上下跳跃,因为三个线程同时更改它。我的问题是我使用 run() 所以它作为一个简单的函数执行而不是 start() 来将它作为线程启动。总之谢谢。

【问题讨论】:

告诉我们,您预计会发生什么以及您看到会发生什么? 【参考方案1】:

我不确定你在这里要做什么,但你需要通过调用 start() 来启动线程。你还需要锁定互斥体,否则有什么意义?

#include <QCoreApplication>
#include <QMutex>
#include <QSemaphore>
#include <QThread>
#include <cstdio>

static const int N = 2000000;

class Thread : public QThread 
public:
  Thread(int id);
  void run();
private:
  int id_;
  static QMutex mutex;
;

QMutex Thread::mutex;
static int g_counter = 0;

int main(int argc, char *argv[]) 
  QCoreApplication app(argc, argv);
  Thread A(0), B(1), C(2);
  A.start();
  B.start();
  C.start();
  char c;
  scanf("%c", &c);
  printf("%d\n", g_counter);
  return app.exec();


Thread::Thread(int id) : id_(id) 

void Thread::run() 

  for (int i = 0; i < N; ++i) 
    mutex.lock();
    ++g_counter;
    printf("g_counter: %d  thread: %d\n", g_counter, id_);
    mutex.unlock();

    mutex.lock();
    --g_counter;
    printf("g_counter: %d  thread: %d\n", g_counter, id_);
    mutex.unlock();
  

【讨论】:

以上是关于试图解决 QThread 的问题的主要内容,如果未能解决你的问题,请参考以下文章

了解 qthread 子类的运行方法和线程上下文

使用 QMessageBox 时无法使用 QThread 设置父错误

如何在 QThread 中使用 QTimer?

如何使用pytest正确退出队列和Qthread进行测试?

QThread - 如何停止工人?

Qthread 不工作,GUI 仍然挂起