diff options
Diffstat (limited to 'src/corelib/thread')
-rw-r--r-- | src/corelib/thread/qthread.cpp | 12 | ||||
-rw-r--r-- | src/corelib/thread/qthread_p.h | 3 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index 20b1f01173..adff853669 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -849,10 +849,12 @@ void QThread::requestInterruption() return; } Q_D(QThread); + // ### Qt 6: use std::atomic_flag, and document that + // requestInterruption/isInterruptionRequested do not synchronize with each other QMutexLocker locker(&d->mutex); if (!d->running || d->finished || d->isInFinish) return; - d->interruptionRequested = true; + d->interruptionRequested.store(true, std::memory_order_relaxed); } /*! @@ -881,10 +883,12 @@ void QThread::requestInterruption() bool QThread::isInterruptionRequested() const { Q_D(const QThread); - QMutexLocker locker(&d->mutex); - if (!d->running || d->finished || d->isInFinish) + // fast path: check that the flag is not set: + if (!d->interruptionRequested.load(std::memory_order_relaxed)) return false; - return d->interruptionRequested; + // slow path: if the flag is set, take into account run status: + QMutexLocker locker(&d->mutex); + return d->running && !d->finished && !d->isInFinish; } /* diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h index 1d38eb0ebf..baeefd87ff 100644 --- a/src/corelib/thread/qthread_p.h +++ b/src/corelib/thread/qthread_p.h @@ -63,6 +63,7 @@ #include "private/qobject_p.h" #include <algorithm> +#include <atomic> #ifdef Q_OS_WINRT namespace ABI { @@ -165,7 +166,7 @@ public: bool running; bool finished; bool isInFinish; //when in QThreadPrivate::finish - bool interruptionRequested; + std::atomic<bool> interruptionRequested; bool exited; int returnCode; |