QThread::terminate()
работает на каждой платформе, независимо от того, что делает поток в данный момент. Конечно, когда вы закончили нитью в приложении, единственное, что вы можете с уверенностью сказать, это позвонить abort
: процесс в целом в этом состоянии. Не делать делать что-либо кроме abort()
-ing после того как вы звоните QThread::terminate
. Поскольку это настолько разрушительно, вы можете также отказаться от вызова terminate
и прервать его напрямую.
Ваш вопрос сформулирован так, как если бы вы планировали продолжить работу с приложением terminate
. Ты не должен!
Увы, если все, что вы хотите, - это выход из потока, при котором семафор является примитивом синхронизации, вы можете сделать это легко, установив флаг и освободив семафор. Ниже представлен несколько надуманный пример, поскольку вы обычно не использовали пул потоков таким образом: это только для того, чтобы сделать код короче.
// https://github.com/KubaO/stackoverflown/tree/master/questions/semaphore-quit-40488523
#include <QtCore>
class Worker : public QRunnable {
static const QString m_key;
static QAtomicInteger<bool> m_abort;
void run() override {
QSystemSemaphore sem{m_key};
qDebug() << "working";
while (true) {
sem.acquire();
if (m_abort.load()) {
sem.release();
qDebug() << "aborting";
return;
}
sem.release();
}
}
public:
static void acquire(int n = 1) {
QSystemSemaphore sem{m_key};
while (n--)
sem.acquire();
}
static void release(int n = 1) {
QSystemSemaphore{m_key}.release(n);
}
static void quit(int n) {
m_abort.store(true);
release(n);
}
};
const QString Worker::m_key = QStringLiteral("semaphore-quit-40488523");
QAtomicInteger<bool> Worker::m_abort = false;
int main()
{
QThreadPool pool;
QVarLengthArray<Worker, 20> workers{20};
for (auto & worker : workers) {
worker.setAutoDelete(false);
pool.start(&worker);
}
Worker::release(workers.size()); // get some workers churning
QThread::sleep(5);
Worker::acquire(workers.size()); // pause all the workers
Worker::quit(workers.size());
// The thread pool destructor will wait for all workers to quit.
}
вы quesiton неясны сформулированы. Вы имеете в виду, когда вы вызываете 'terminate' в потоке, поток ничем не задумывается и застрял в' QSystemSemaphore :: приобретать() '? – Hayt
Это проблема XY: вы должны позволить нам увидеть лес, а не отдельные деревья. Что именно вы делаете? Скорее всего, есть гораздо более простое решение вашей проблемы - какова бы ни была эта проблема. Измените вопрос, чтобы уточнить структуру вашей системы, возможно, создав короткий тестовый пример. Вы можете легко запускать несколько процессов из одного 'main.cpp'! (Http://stackoverflow.com/a/18602568/1329652). –