QMutex с QThread - ошибка сегментации

У меня есть программа C++ Qt, которая использует QThread с механизмом паузы / возобновления, реализованным с использованием QMutex и QWaitCondition. Вот как это выглядит:

MyThread.h:

class MyThread : public QThread
{
    Q_OBJECT

    public:
        MyThread();
        void pauseThread();
        void resumeThread();

    private:
        void run();
        QMutex syncMutex;
        QWaitCondition pauseCond;
        bool pause = false;
}

MyThread.cpp:

void MyThread::pauseThread()
{
    syncMutex.lock();
    pause = true;
    syncMutex.unlock();
}

void MyThread::resumeThread()
{
    syncMutex.lock();
    pause = false;
    syncMutex.unlock();
    pauseCond.wakeAll();
}

void MyThread::run()
{
    for ( int x = 0; x < 1000; ++x )
    {
        syncMutex.lock();
        if ( pause == true )
        {
            pauseCond.wait ( &syncMutex );
        }
        syncMutex.unlock();
        //do some work
    }
}

Я использую вектор классов MyThread:

void MyClass::createThreads()
{
    for ( int x = 0; x < 2; ++x)
    {
        MyThread *thread = new MyThread();
        thread->start();

        //"std::vector<MyThread *> threadsVector" is defined in header file
        this->threadsVector.push_back ( thread ); 
    }
}

void MyClass::pause()
{
    for ( uint x = 0; x < sizeof ( this->threadsVector ); ++x )
    {
        this->threadsVector[x]->pauseThread();
    }
}

void MyClass::resume()
{
    for ( uint x = 0; x < sizeof ( this->threadsVector ); ++x )
    {
        this->threadsVector[x]->resumeThread();
    }
}

Когда я звоню pause() метод MyClass, Я получаю сигнал ошибки сегментации, указывающий (в режиме отладки) на строку 3 в MyThread.cpp - syncMutex.lock();, Это не зависит от количества MyThread экземпляры - это безубыточность даже с 1 потоком в std:: vector.

Я почти уверен, что пропустил что-то важное, но не знаю что. Что я делаю неправильно?

(Если это имеет значение, я использую MinGW 4.7 компилятор с Qt 5)

1 ответ

Решение

В петлях для использования this->threadsVector.size() вместо sizeof(this->threadsVector) чтобы узнать, сколько элементов содержит вектор.

Другие вопросы по тегам