Я хочу реализовать многопоточную среду с использованием 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 () убивал все запущенные потоки, фиксировал его изменения и перезапускал. Чего я хочу добиться, так это того, что после запуска этого метода он вызывает «abort», а затем ждет завершения всех потоков. Неправильное использование мьютексов:
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 я получаю сообщение об ошибке). Как лучше всего достичь своей цели, не сталкиваясь с гоночными условиями и тупиками? Есть ли лучший дизайн, чем тот, который я предложил здесь?