我想使用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;
}
}
}
的目的是,所述槽changeSomeSettings()殺死所有正在運行的線程,其提交更改和重新啓動它。我想要實現的是,一旦這個方法已經啓動,它會調用「中止」,然後等到所有線程都終止。以錯誤的方式使用互斥:
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();
}
這實際工作中的Qt的MacOSX下,但根據文檔互斥鎖2,必須在同一個線程解鎖(和Windows我得到一個錯誤)。在不遇到賽車條件和僵局的情況下達成目標的最佳方式是什麼?有沒有比我在這裏提出的更好的設計?
感謝提供QWaitConditions的提示。 – Searles 2010-05-26 15:32:12