QFuture: mention the work-stealing algorithm in the docs

A number of users have explored the behavior and complained about it.
Lets add a \note explaining this. The function in charge is
QThreadPool::stealAndRunRunnable(QRunnable *), which is a private
function, exclusively used by:

  QFutureInterfaceBase::waitForResult()
  QFutureInterfaceBase::waitForFinished()

also update the documentation to reflect these changes accordingly.

Fixes: QTBUG-112351
Pick-to: 6.6 6.5 6.2 5.15
Change-Id: I839858cb449063d8af9bef64d2f35a6816a419b0
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Dennis Oberst 2023-06-14 18:31:40 +02:00
parent 855c448469
commit 0235de994b
2 changed files with 9 additions and 5 deletions

View File

@ -259,9 +259,8 @@
\since 5.4 \since 5.4
\fn QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...); \fn QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...);
Runs \a function in a separate thread. The thread is taken from the Schedules \a function on \a pool. Note that \a function may not run
QThreadPool \a pool. Note that \a function may not run immediately; \a function immediately; \a function will only be run once a thread becomes available.
will only be run once a thread becomes available.
\include qtconcurrentrun.cpp run-description \include qtconcurrentrun.cpp run-description
*/ */

View File

@ -122,6 +122,12 @@
QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(), and QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(), and
QtFuture::makeExceptionalFuture(). QtFuture::makeExceptionalFuture().
\note Some APIs (see \l {QFuture::then()} or various QtConcurrent method
overloads) allow scheduling the computation to a specific thread pool.
However, QFuture implements a work-stealing algorithm to prevent deadlocks
and optimize thread usage. As a result, computations can be executed
directly in the thread which requests the QFuture's result.
\note To start a computation and store results in a QFuture, use QPromise or \note To start a computation and store results in a QFuture, use QPromise or
one of the APIs in the \l {Qt Concurrent} framework. one of the APIs in the \l {Qt Concurrent} framework.
@ -1257,8 +1263,7 @@
Attaches a continuation to this future, allowing to chain multiple asynchronous Attaches a continuation to this future, allowing to chain multiple asynchronous
computations if desired. When the asynchronous computation represented by this computations if desired. When the asynchronous computation represented by this
future finishes, \a function will be invoked in a separate thread taken from the future finishes, \a function will be scheduled on \a pool.
QThreadPool \a pool.
\sa onFailed(), onCanceled() \sa onFailed(), onCanceled()
*/ */