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

View File

@ -122,6 +122,12 @@
QtFuture::makeReadyValueFuture(), QtFuture::makeReadyRangeFuture(), and
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
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
computations if desired. When the asynchronous computation represented by this
future finishes, \a function will be invoked in a separate thread taken from the
QThreadPool \a pool.
future finishes, \a function will be scheduled on \a pool.
\sa onFailed(), onCanceled()
*/