C++ 实现一个多线程环境

C++ 实现一个多线程环境,c++,multithreading,qt4,mutex,C++,Multithreading,Qt4,Mutex,我想使用Qt4实现一个多线程环境。在类似c++的伪代码中,其思想如下: class Thread : public QThread { QList<SubThread*> threads_; public: void run() { foreach(SubThread* thread : threads) { thread.start(); } foreach(SubThread* threa

我想使用Qt4实现一个多线程环境。在类似c++的伪代码中,其思想如下:

class Thread : public QThread {
    QList<SubThread*> threads_;

public:
    void run() {
        foreach(SubThread* thread : threads) {
            thread.start();
        }

        foreach(SubThread* thread : threads) {
            thread.wait();
        }
    }

    void abort() {
        foreach(SubThread* thread : threads) {
            thread.cancel();
        }
    }

public slots:
    // This method is called from the main-thread
    // (sometimes via some signal-slot-connection)
    void changeSomeSettings() {
        abort();
        // change settings
        start();
    }
}

class SubThread : public QThread {
    bool isCancelled_;

public:
    void run() {
        while(!isCancelled or task completed) {
            // something that takes some time...
        }
    }

    void cancel() {
        if(isRunning() {
            isCancelled_ = true;
        }
    }
}

这实际上在MacOSX下的Qt中起作用,但是根据文档,mutex2必须在同一个线程中解锁(在Windows中我得到一个错误)。在不陷入比赛状态和僵局的情况下,实现我的目标的最佳方式是什么?有比我在这里提出的更好的设计吗?

在这种情况下,您可能希望使用条件变量而不是互斥。条件变量是一个线程向另一个线程发送信号的一种方式。QT的实现似乎是:

我可能会让子线程定期检查条件变量的状态。这可以通过QTWaitCondition::wait()完成,并具有短/0超时。如果正在发送信号,则锁定包含更新数据的共享内存区域,并访问需要更新的数据。然后该线程可以相应地安全地重新启动自身


中止线程通常不是一个好主意。您可能最终泄漏内存/资源/句柄/锁等。您不知道该线程在其调用堆栈中的位置,并且可能无法保证堆栈将为您“解缠”,并且会调用所有析构函数。这是子线程定期检查条件变量以获取更新数据并使用新数据安全地重新启动自己的另一个原因

感谢您对QWaitConditions的提示。
    void Thread::changeSomeSettings() {
        mutex1.lock();
        abort();

        mutex2.lock();

        start();
        mutex1.unlock();
    }

    void Thread::run() {
        foreach(Thread* thread : threads) {
            thread.start();
        }

        foreach(Thread* thread : threads) {
            thread.wait();
        }

        mutex2.unlock();
    }