qt5base-lts/tests/auto/corelib
Giuseppe D'Angelo 84fba93ebb QThread::create(): request interruption and join on destruction
If one destroys a running QThread, so far the behavior has been to crash
(à la std::thread) -- assuming the thread hasn't already signalled that
it has finished. This behavior is hostile to solutions such as using
QThread::create(), which always require a wait() before destroying the
thread object.

We can use the opportunity to change the behavior without breaking any
valid code. Instead of crashing, inside QThread's destructor we can ask
the new thread to quit, and then join it (à la std::jthread). This
simplifies the implementation of long-living runnables and the code that
manages them.

Deploying this solution for the whole QThread class may not be entirely
painless. While no correct code would work differently with the proposed
changes, incorrect code that deletes a running thread would no longer
crash "loudly" -- instead, it might deadlock "quietly", have memory
corruptions, etc.

Hence I'm limiting this approach to only the threads created by
QThread::create(), at least for the time being. This also side-steps
perhaps the biggest problem of generalizing the approach, which is that
placing such interrupt+join logic into~QThread's destructor would cause
it to be run _after_ a QThread subclass' own destructor has run,
destroying the subclass' data members too early. This might create
an antipattern if one chooses to subclass QThread. With create(), a
subclass in question exists, and it indeed has NSDMs, but it's entirely
under our control (in fact, I'm placing the logic just in its dtor).

[ChangeLog][QtCore][QThread] Destroying a QThread object created by
QThread::create() while the thread that it manages is still running will
now automatically ask that thread to quit, and will wait until the
thread has finished. Before, this resulted in a program crash. See the
documentation of QThread::~QThread() for more details.

Change-Id: Ib268b13da422e277ee3ed6f6c7b2ecc8cea5750c
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2021-12-07 16:56:49 +01:00
..
animation Include qproperty.h where needed 2021-11-04 21:45:02 +01:00
global Fix tst_qfloat16 runtime failure for INTEGRITY 2021-12-06 18:53:50 +00:00
io QFile: Add open() overload that accepts permissions argument 2021-12-04 01:27:11 +01:00
itemmodels Shorten target name for qsortfilterproxymodel auto tests 2021-11-29 08:08:21 +01:00
kernel tst_qmetatype: factor the most expensive test into its own TU 2021-12-07 15:57:33 +01:00
mimetypes Compile autotests for Integrity 2021-09-20 17:29:04 +03:00
platform Android: Add runOnMainAndroidThread() under QNativeInterface 2021-05-26 23:24:11 +00:00
plugin QNX: check and use elf.h from alternative location 2021-11-30 14:37:52 +02:00
serialization Remove conditioning on Android embedded 2021-09-17 17:30:14 +02:00
text QStringBuilder: Add support for QByteArrayView 2021-12-04 08:21:22 +00:00
thread QThread::create(): request interruption and join on destruction 2021-12-07 16:56:49 +01:00
time Skip QTimeZone::checkOffset() if there are no valid zones to test 2021-11-26 02:14:52 +01:00
tools QMultiHash: fix erase returning the wrong iterator 2021-12-07 03:07:49 +01:00
CMakeLists.txt Add tests for QAndroidApplication's sdkVersion and activity 2021-05-13 01:41:36 +03:00