试图解决 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 的问题的主要内容,如果未能解决你的问题,请参考以下文章