Я хочу реализовать многопоточную среду с использованием 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, но в соответствии с документацией mutex2 должны быть разблокированы в том же потоке (и в Windows, я получаю сообщение об ошибке). Каков наилучший способ достичь моей цели, не вбегая в гоночные условия и тупики? Есть ли лучший дизайн, чем тот, который я предложил здесь?
Спасибо за подсказку с условиями QWaitConditions. – Searles