Попытка получить проблемы с QThread - PullRequest
1 голос
/ 21 мая 2011

Привет, ребята, я изучаю 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 Ответ

2 голосов
/ 24 мая 2011

Я не уверен, что вы пытаетесь сделать здесь, но вам нужно запустить поток, вызвав 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...