From 706eeadf3aa226ea02496c352006b26abe791f07 Mon Sep 17 00:00:00 2001 From: Sze Howe Koh Date: Thu, 7 Nov 2013 00:24:20 +0800 Subject: [PATCH] Doc: Move threading overviews from qtbase.git to qtdoc.git - This topic is relevant to multiple modules, as illustrated by the "Thread-Support in Qt Modules" page. Multithreading can be done in both C++ and QML. - Moving also fixes links to QML-related pages. - Snippets are copied, not moved. QThreadStorage docs need them. - QDoc: "DEPENDS += qtdoc" added to keep the "\reentrant" command working. It creates a link to the "reentrant" keyword. Change-Id: I2cdf6139e62d66911561c30fcca7aab160a694b1 Reviewed-by: Jerome Pasion --- src/corelib/doc/images/threadsandobjects.png | Bin 66096 -> 0 bytes .../doc/images/threadvisual-example.png | Bin 16823 -> 0 bytes src/corelib/doc/src/threads-basics.qdoc | 244 ------ src/corelib/doc/src/threads.qdoc | 828 ------------------ src/xml/doc/qtxml.qdocconf | 2 +- 5 files changed, 1 insertion(+), 1073 deletions(-) delete mode 100644 src/corelib/doc/images/threadsandobjects.png delete mode 100644 src/corelib/doc/images/threadvisual-example.png delete mode 100644 src/corelib/doc/src/threads-basics.qdoc delete mode 100644 src/corelib/doc/src/threads.qdoc diff --git a/src/corelib/doc/images/threadsandobjects.png b/src/corelib/doc/images/threadsandobjects.png deleted file mode 100644 index 8357d2532a3ea032bf7a2774aefb1aa7fb5f4c8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66096 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 F{s(aQ=h*-N diff --git a/src/corelib/doc/images/threadvisual-example.png b/src/corelib/doc/images/threadvisual-example.png deleted file mode 100644 index 2a49874719ef2a7e97fcdbae9f1a4ecfe9185581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16823 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 diff --git a/src/corelib/doc/src/threads-basics.qdoc b/src/corelib/doc/src/threads-basics.qdoc deleted file mode 100644 index 2206899460..0000000000 --- a/src/corelib/doc/src/threads-basics.qdoc +++ /dev/null @@ -1,244 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: http://www.gnu.org/copyleft/fdl.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \page thread-basics.html - \ingroup tutorials - \startpage {index.html}{Qt Reference Documentation} - - \title Threading Basics - \brief An introduction to threads - - \section1 What Are Threads? - - Threads are about doing things in parallel, just like processes. So how do - threads differ from processes? While you are making calculations on a - spreadsheet, there may also be a media player running on the same desktop - playing your favorite song. Here is an example of two processes working in - parallel: one running the spreadsheet program; one running a media player. - Multitasking is a well known term for this. A closer look at the media - player reveals that there are again things going on in parallel within one - single process. While the media player is sending music to the audio driver, - the user interface with all its bells and whistles is being constantly - updated. This is what threads are for -- concurrency within one single - process. - - So how is concurrency implemented? Parallel work on single core CPUs is an - illusion which is somewhat similar to the illusion of moving images in - cinema. - For processes, the illusion is produced by interrupting the processor's - work on one process after a very short time. Then the processor moves on to - the next process. In order to switch between processes, the current program - counter is saved and the next processor's program counter is loaded. This - is not sufficient because the same needs to be done with registers and - certain architecture and OS specific data. - - Just as one CPU can power two or more processes, it is also possible to let - the CPU run on two different code segments of one single process. When a - process starts, it always executes one code segment and therefore the - process is said to have one thread. However, the program may decide to - start a second thread. Then, two different code sequences are processed - simultaneously inside one process. Concurrency is achieved on single core - CPUs by repeatedly saving program counters and registers then loading the - next thread's program counters and registers. No cooperation from the - program is required to cycle between the active threads. A thread may be in - any state when the switch to the next thread occurs. - - The current trend in CPU design is to have several cores. A typical - single-threaded application can make use of only one core. However, a - program with multiple threads can be assigned to multiple cores, making - things happen in a truly concurrent way. As a result, distributing work - to more than one thread can make a program run much faster on multicore - CPUs because additional cores can be used. - - \section2 GUI Thread and Worker Thread - - As mentioned, each program has one thread when it is started. This thread - is called the "main thread" (also known as the "GUI thread" in Qt - applications). The Qt GUI must run in this thread. All widgets and several - related classes, for example QPixmap, don't work in secondary threads. - A secondary thread is commonly referred to as a "worker thread" because it - is used to offload processing work from the main thread. - - \section2 Simultaneous Access to Data - - Each thread has its own stack, which means each thread has its own call - history and local variables. Unlike processes, threads share the same - address space. The following diagram shows how the building blocks of - threads are located in memory. Program counter and registers of inactive - threads are typically kept in kernel space. There is a shared copy of the - code and a separate stack for each thread. - - \image threadvisual-example.png "Thread visualization" - - If two threads have a pointer to the same object, it is possible that both - threads will access that object at the same time and this can potentially - destroy the object's integrity. It's easy to imagine the many things that - can go wrong when two methods of the same object are executed - simultaneously. - - Sometimes it is necessary to access one object from different threads; - for example, when objects living in different threads need to communicate. - Since threads use the same address space, it is easier and faster for - threads to exchange data than it is for processes. Data does not have to be - serialized and copied. Passing pointers is possible, but there must be a - strict coordination of what thread touches which object. Simultaneous - execution of operations on one object must be prevented. There are several - ways of achieving this and some of them are described below. - - So what can be done safely? All objects created in a thread can be used - safely within that thread provided that other threads don't have references - to them and objects don't have implicit coupling with other threads. Such - implicit coupling may happen when data is shared between instances as with - static members, singletons or global data. Familiarize yourself with the - concept of \l{Reentrancy and Thread-Safety}{thread safe and reentrant} - classes and functions. - - \section1 Using Threads - - There are basically two use cases for threads: - - \list - \li Make processing faster by making use of multicore processors. - \li Keep the GUI thread or other time critical threads responsive by - offloading long lasting processing or blocking calls to other threads. - \endlist - - \section2 When to Use Alternatives to Threads - - Developers need to be very careful with threads. It is easy to start other - threads, but very hard to ensure that all shared data remains consistent. - Problems are often hard to find because they may only show up once in a - while or only on specific hardware configurations. Before creating threads - to solve certain problems, possible alternatives should be considered. - - \table - \header - \li Alternative - \li Comment - \row - \li QEventLoop::processEvents() - \li Calling QEventLoop::processEvents() repeatedly during a - time-consuming calculation prevents GUI blocking. However, this - solution doesn't scale well because the call to processEvents() may - occur too often, or not often enough, depending on hardware. - \row - \li QTimer - \li Background processing can sometimes be done conveniently using a - timer to schedule execution of a slot at some point in the future. - A timer with an interval of 0 will time out as soon as there are no - more events to process. - \row - \li QSocketNotifier QNetworkAccessManager QIODevice::readyRead() - \li This is an alternative to having one or multiple threads, each with - a blocking read on a slow network connection. As long as the - calculation in response to a chunk of network data can be executed - quickly, this reactive design is better than synchronous waiting in - threads. Reactive design is less error prone and energy efficient - than threading. In many cases there are also performance benefits. - \endtable - - In general, it is recommended to only use safe and tested paths and to - avoid introducing ad-hoc threading concepts. The QtConcurrent module provides an easy - interface for distributing work to all of the processor's cores. The - threading code is completely hidden in the QtConcurrent framework, so you - don't have to take care of the details. However, QtConcurrent can't be used - when communication with the running thread is needed, and it shouldn't be - used to handle blocking operations. - - \section2 Which Qt Thread Technology Should You Use? - - See the \l{Multithreading Technologies in Qt} page for an introduction to the - different approaches to multithreading to Qt, and for guidelines on how to - choose among them. - - - \section1 Qt Thread Basics - - The following sections describe how QObjects interact with threads, how - programs can safely access data from multiple threads, and how asynchronous - execution produces results without blocking a thread. - - \section2 QObject and Threads - - As mentioned above, developers must always be careful when calling objects' - methods from other threads. \l{QObject#Thread Affinity}{Thread affinity} - does not change this situation. - Qt documentation marks several methods as thread-safe. - \l{QCoreApplication::}{postEvent()} is a noteworthy example. A thread-safe - method may be called from different threads simultaneously. - - In cases where there is usually no concurrent access to methods, calling - non-thread-safe methods of objects in other threads may work thousands - of times before a concurrent access occurs, causing unexpected behavior. - Writing test code does not entirely ensure thread correctness, but it is - still important. - On Linux, Valgrind and Helgrind can help detect threading errors. - - \section2 Protecting the Integrity of Data - - When writing a multithread application, extra care must be taken to avoid - data corruption. See \l{Synchronizing Threads} for a discussion on how to - use threads safely. - - \section2 Dealing with Asynchronous Execution - - One way to obtain a worker thread's result is by waiting for the thread - to terminate. In many cases, however, a blocking wait isn't acceptable. The - alternative to a blocking wait are asynchronous result deliveries with - either posted events or queued signals and slots. This generates a certain - overhead because an operation's result does not appear on the next source - line, but in a slot located somewhere else in the source file. Qt - developers are used to working with this kind of asynchronous behavior - because it is much similar to the kind of event-driven programming used in - GUI applications. - - \section1 Examples - - Qt comes with several examples for using threads. See the class references - for QThread and QThreadPool for simple examples. See the \l{Threading and - Concurrent Programming Examples} page for more advanced ones. - - \section1 Digging Deeper - - Threading is a very complicated subject. Qt offers more classes for - threading than we have presented in this tutorial. The following materials - can help you go into the subject in more depth: - - \list - \li Good video tutorials about threads with Qt can be found in the material - from the \l{Training Day at Qt Developer Days 2009}. - \li The \l{Thread Support in Qt} document is a good starting point into - the reference documentation. - \li Qt comes with several additional examples for - \l{Threading and Concurrent Programming Examples}{QThread and QtConcurrent}. - \li Several good books describe how to work with Qt threads. The most - extensive coverage can be found in \e{Advanced Qt Programming} by Mark - Summerfield, Prentice Hall - roughly 70 of 500 pages cover QThread and - QtConcurrent. - \endlist -*/ diff --git a/src/corelib/doc/src/threads.qdoc b/src/corelib/doc/src/threads.qdoc deleted file mode 100644 index efed33106a..0000000000 --- a/src/corelib/doc/src/threads.qdoc +++ /dev/null @@ -1,828 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: http://www.gnu.org/copyleft/fdl.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \group thread - \title Threading Classes - - These \l{Qt Core} classes provide threading support to applications. - The \l{Thread Support in Qt} page covers how to use these classes. -*/ - -/*! - \page threads.html - \title Thread Support in Qt - \ingroup qt-basic-concepts - \brief A detailed discussion of thread handling in Qt. - - \ingroup frameworks-technologies - - \nextpage Multithreading Technologies in Qt - - Qt provides thread support in the form of platform-independent - threading classes, a thread-safe way of posting events, and - signal-slot connections across threads. This makes it easy to - develop portable multithreaded Qt applications and take advantage - of multiprocessor machines. Multithreaded programming is also a - useful paradigm for performing time-consuming operations without - freezing the user interface of an application. - - Earlier versions of Qt offered an option to build the library - without thread support. Since Qt 4.0, threads are always enabled. - - \section1 Topics: - - \list - \li \l{Recommended Reading} - \li \l{The Threading Classes} - \li \l{Multithreading Technologies in Qt} - \li \l{Synchronizing Threads} - \li \l{Reentrancy and Thread-Safety} - \li \l{Threads and QObjects} - \li \l{Thread-Support in Qt Modules} - \endlist - - \section1 Recommended Reading - - This document is intended for an audience that has knowledge of, - and experience with, multithreaded applications. If you are new - to threading see our Recommended Reading list: - - \list - \li \l {http://www.amazon.com/Threads-Primer-Guide-Multithreaded-Programming/dp/0134436989}{Threads Primer: A Guide to Multithreaded Programming} - \li \l {http://www.amazon.com/Thread-Time-MultiThreaded-Programming-Guide/dp/0131900676}{Thread Time: The Multithreaded Programming Guide} - \li \l {http://www.amazon.com/Pthreads-Programming-Standard-Multiprocessing-Nutshell/dp/1565921151a}{Pthreads Programming: A POSIX Standard for Better Multiprocessing} - \li \l {http://www.amazon.com/WIN32-Multithreaded-Programming-Aaron-Cohen/dp/1565922964}{Win32 Multithreaded Programming} - \endlist - - \section1 The Threading Classes - - These classes are relevant to threaded applications. - - \annotatedlist thread - -\omit - \list - \li QThread provides the means to start a new thread. - \li QThreadStorage provides per-thread data storage. - \li QThreadPool manages a pool of threads that run QRunnable objects. - \li QRunnable is an abstract class representing a runnable object. - \li QMutex provides a mutual exclusion lock, or mutex. - \li QMutexLocker is a convenience class that automatically locks - and unlocks a QMutex. - \li QReadWriteLock provides a lock that allows simultaneous read access. - \li QReadLocker and QWriteLocker are convenience classes that automatically - lock and unlock a QReadWriteLock. - \li QSemaphore provides an integer semaphore (a generalization of a mutex). - \li QWaitCondition provides a way for threads to go to sleep until - woken up by another thread. - \li QAtomicInt provides atomic operations on integers. - \li QAtomicPointer provides atomic operations on pointers. - \endlist -\endomit - - \note Qt's threading classes are implemented with native threading APIs; - e.g., Win32 and pthreads. Therefore, they can be used with threads of the - same native API. -*/ - -/*! - \page threads-technologies.html - \title Multithreading Technologies in Qt - \ingroup qt-basic-concepts - \brief An overview and comparison of different ways to use threads in Qt. - - \ingroup frameworks-technologies - - \contentspage Thread Support in Qt - \previouspage Thread Support in Qt - \nextpage Synchronizing Threads - - Qt offers many classes and functions for working with threads. Below are - four different approaches that Qt programmers can use to implement - multithreaded applications. - - - \section1 QThread: Low-Level API with Optional Event Loops - - QThread is the foundation of all thread control in Qt. Each QThread - instance represents and controls one thread. - - QThread can either be instantiated directly or subclassed. Instantiating a - QThread provides a parallel event loop, allowing QObject slots to be invoked - in a secondary thread. Subclassing a QThread allows the application to initialize - the new thread before starting its event loop, or to run parallel code - without an event loop. - - See the \l{QThread}{QThread class reference} and the \l{Threading and - Concurrent Programming Examples}{threading examples} for demonstrations on - how to use QThread. - - - \section1 QThreadPool and QRunnable: Reusing Threads - - Creating and destroying threads frequently can be expensive. To reduce this - overhead, existing threads can be reused for new tasks. QThreadPool is a - collection of reuseable QThreads. - - To run code in one of a QThreadPool's threads, reimplement QRunnable::run() - and instantiate the subclassed QRunnable. Use QThreadPool::start() to put - the QRunnable in the QThreadPool's run queue. When a thread becomes available, - the code within QRunnable::run() will execute in that thread. - - Each Qt application has a global thread pool, which is accessible through - QThreadPool::globalInstance(). This global thread pool automatically maintains - an optimal number of threads based on the number of cores in the CPU. However, - a separate QThreadPool can be created and managed explicitly. - - - \section1 Qt Concurrent: Using a High-level API - - The \l{Qt Concurrent} module provides high-level functions that deal with some - common parallel computation patterns: map, filter, and reduce. Unlike using - QThread and QRunnable, these functions never require the use of \l{Synchronizing - Threads#Low-Level Synchronization Primitives}{low-level threading primitives} - such as mutexes or semaphores. Instead, they return a QFuture object which can - be used to retrieve the functions' results when they are ready. QFuture can - also be used to query computation progress and to pause/resume/cancel the - computation. For convenience, QFutureWatcher enables interactions with - \l{QFuture}s via signals and slots. - - \l{Qt Concurrent}'s map, filter and reduce algorithms automatically distribute - computation across all available processor cores, so applications written today - will continue to scale when deployed later on a system with more cores. - - This module also provides the QtConcurrent::run() function, which can run any - function in another thread. However, QtConcurrent::run() only supports a subset - of features available to the map, filter and reduce functions. The QFuture - can be used to retrieve the function's return value and to check if the thread - is running. However, a call to QtConcurrent::run() uses one thread only, cannot - be paused/resumed/canceled, and cannot be queried for progress. - - See the \l{Qt Concurrent} module documentation for details on the individual functions. - - - \section1 WorkerScript: Threading in QML - - The WorkerScript QML type lets JavaScript code run in parallel with the GUI - thread. - - Each WorkerScript instance can have one \c{.js} script attached to it. When - WorkerScript::sendMessage() is called, the script will run in a separate thread - (and a separate \l{QQmlContext}{QML context}). When the script finishes - running, it can send a reply back to the GUI thread which will invoke the - WorkerScript::onMessage() signal handler. - - Using a WorkerScript is similar to using a worker QObject that has been moved - to another thread. Data is transferred between threads via signals. - - See the WorkerScript documentation for details on how to implement the script, - and for a list of data types that can be passed between threads. - - - \section1 Choosing an Appropriate Approach - - As demonstrated above, Qt provides different solutions for developing threaded - applications. The right solution for a given application depends on the purpose - of the new thread and the thread's lifetime. Below is a comparison of Qt's - threading technologies, followed by recommended solutions for some example use cases. - - \section2 Comparison of Solutions - - \table - \header - \li Feature - \li QThread - \li QRunnable and QThreadPool - \li QtConcurrent::run() - \li Qt Concurrent (Map, Filter, Reduce) - \li WorkerScript - \row - \li API - \li C++ - \li C++ - \li C++ - \li C++ - \li QML - \row - \li Thread priority can be specified - \li Yes - \li Yes - \li - \li - \li - \row - \li Thread can run an event loop - \li Yes - \li - \li - \li - \li - \row - \li Thread can receive data updates through signals - \li Yes (received by a worker QObject) - \li - \li - \li - \li Yes (received by WorkerScript) - \row - \li Thread can be controlled using signals - \li Yes (received by QThread) - \li - \li - \li Yes (received by QFutureWatcher) - \li - \row - \li Thread can be monitored through a QFuture - \li - \li - \li Partially - \li Yes - \li - \row - \li Built-in ability to pause/resume/cancel - \li - \li - \li - \li Yes - \li - \endtable - - - \section2 Example Use Cases - - \table - \header - \li Lifetime of thread - \li Operation - \li Solution - \row - \li One call - \li Run a new linear function within another thread, optionally with progress - updates during the run. - \li Qt provides different solutions: - \list - \li Place the function in a reimplementation of QThread::run() and - start the QThread. Emit signals to update progress. OR - \li Place the function in a reimplementation of QRunnable::run() and - add the QRunnable to a QThreadPool. Write to a \l{Synchronizing - Threads}{thread-safe variable} to update progress. OR - \li Run the function using QtConcurrent::run(). Write to a \l{Synchronizing - Threads}{thread-safe variable} to update progress. - \endlist - \row - \li One call - \li Run an existing function within another thread and get its return value. - \li Run the function using QtConcurrent::run(). Have a QFutureWatcher emit - the \l{QFutureWatcher::}{finished()} signal when the function has - returned, and call QFutureWatcher::result() to get the function's return - value. - \row - \li One call - \li Perform an operation on all items of a container, using all available - cores. For example, producing thumbnails from a list of images. - \li Use Qt Concurrent's \l{QtConcurrent::}{filter()} function to select - container elements, and the \l{QtConcurrent::}{map()} function to apply - an operation to each element. To fold the output into a single result, - use \l{QtConcurrent::}{filteredReduced()} and - \l{QtConcurrent::}{mappedReduced()} instead. - \row - \li One call/Permanent - \li Perfrom a long computation in a pure QML application, and update the GUI - when the results are ready. - \li Place the computation code in a \c{.js} script and attach it to a - WorkerScript instance. Call \l{WorkerScript::}{sendMessage()} to start the - computation in a new thread. Let the script call WorkerScript::sendMessage() - too, to pass the result back to the GUI thread. Handle the result in - \l{WorkerScript::}{onMessage} and update the GUI there. - \row - \li Permanent - \li Have an object living in another thread that can perform different - tasks upon request and/or can receive new data to work with. - \li Subclass a QObject to create a worker. Instantiate this worker object - and a QThread. Move the worker to the new thread. Send commands or - data to the worker object over queued signal-slot connections. - \row - \li Permanent - \li Repeatedly perform an expensive operation in another thread, where the - thread does not need to receive any signals or events. - \li Write the infinite loop directly within a reimplementation of QThread::run(). - Start the thread without an event loop. Let the thread emit signals to - send data back to the GUI thread. - \endtable -*/ - -/*! - \page threads-synchronizing.html - \title Synchronizing Threads - - \previouspage Multithreading Technologies in Qt - \contentspage Thread Support in Qt - \nextpage Reentrancy and Thread-Safety - - While the purpose of threads is to allow code to run in parallel, - there are times where threads must stop and wait for other - threads. For example, if two threads try to write to the same - variable simultaneously, the result is undefined. The principle of - forcing threads to wait for one another is called \e{mutual exclusion}. - It is a common technique for protecting shared resources such as data. - - Qt provides low-level primitives as well as high-level mechanisms - for synchronizing threads. - - \section1 Low-Level Synchronization Primitives - - QMutex is the basic class for enforcing mutual exclusion. A thread - locks a mutex in order to gain access to a shared resource. If a second - thread tries to lock the mutex while it is already locked, the second - thread will be put to sleep until the first thread completes its task - and unlocks the mutex. - - QReadWriteLock is similar to QMutex, except that it distinguishes - between "read" and "write" access. When a piece of data is not being - written to, it is safe for multiple threads to read from it simultaneously. - A QMutex forces multiple readers to take turns to read shared data, but a - QReadWriteLock allows simultaneous reading, thus improving parallelism. - - QSemaphore is a generalization of QMutex that protects a certain - number of identical resources. In contrast, a QMutex protects - exactly one resource. The \l{Semaphores Example} shows a typical application - of semaphores: synchronizing access to a circular buffer between a producer - and a consumer. - - QWaitCondition synchronizes threads not by enforcing mutual exclusion but by - providing a \e{condition variable}. While the other primitives make threads - wait until a resource is unlocked, QWaitCondition makes threads wait until a - particular condition has been met. To allow the waiting threads to proceed, - call \l{QWaitCondition::wakeOne()}{wakeOne()} to wake one randomly - selected thread or \l{QWaitCondition::wakeAll()}{wakeAll()} to wake them all - simultaneously. The \l{Wait Conditions Example} shows how to solve the - producer-consumer problem using QWaitCondition instead of QSemaphore. - - \note Qt's synchronization classes rely on the use of properly - aligned pointers. For instance, you cannot use packed classes with - MSVC. - - These synchronization classes can be used to make a method thread safe. - However, doing so incurs a performance penalty, which is why most Qt methods - are not made thread safe. - - \section2 Risks - - If a thread locks a resource but does not unlock it, the application may - freeze because the resource will become permanently unavailable to other threads. - This can happen, for example, if an exception is thrown and forces the current - function to return without releasing its lock. - - Another similar scenario is a \e{deadlock}. For example, suppose that - thread A is waiting for thread B to unlock a resource. If thread B is also - waiting for thread A to unlock a different resource, then both threads will - end up waiting forever, so the application will freeze. - - \section2 Convenience classes - - QMutexLocker, QReadLocker and QWriteLocker are convenience classes that make it - easier to use QMutex and QReadWriteLock. They lock a resource when they are - constructed, and automatically unlock it when they are destroyed. They are - designed to simplify code that use QMutex and QReadWriteLock, thus reducing - the chances that a resource becomes permanently locked by accident. - - \section1 High-Level Event Queues - - Qt's \l{The Event System}{event system} is very useful for inter-thread - communication. Every thread may have its own event loop. To call a slot (or - any \l{Q_INVOKABLE}{invokable} method) in another thread, place that call in - the target thread's event loop. This lets the target thread finish its current - task before the slot starts running, while the original thread continues - running in parallel. - - To place an invocation in an event loop, make a queued \l{Signals & Slots} - {signal-slot} connection. Whenever the signal is emitted, its arguments will - be recorded by the event system. The thread that the signal receiver - \l{QObject#Thread Affinity}{lives in} will then run the slot. Alternatively, - call QMetaObject::invokeMethod() to achieve the same effect without signals. - In both cases, a \l{Qt::QueuedConnection}{queued connection} must be used - because a \l{Qt::DirectConnection}{direct connection} bypasses the event - system and runs the method immediately in the current thread. - - There is no risk of deadlocks when using the event system for thread - synchronization, unlike using low-level primitives. However, the event system - does not enforce mutual exclusion. If invokable methods access shared data, - they must still be protected with low-level primitives. - - Having said that, Qt's event system, along with \l{Implicit Sharing}{implicitly - shared} data structures, offers an alternative to traditional thread locking. - If signals and slots are used exclusively and no variables are shared between - threads, a multithreaded program can do without low-level primitives altogether. - - \sa QThread::exec(), {Threads and QObjects} -*/ - -/*! - \page threads-reentrancy.html - \title Reentrancy and Thread-Safety - - \keyword reentrant - \keyword thread-safe - - \previouspage Synchronizing Threads - \contentspage Thread Support in Qt - \nextpage Threads and QObjects - - Throughout the documentation, the terms \e{reentrant} and - \e{thread-safe} are used to mark classes and functions to indicate - how they can be used in multithread applications: - - \list - \li A \e thread-safe function can be called simultaneously from - multiple threads, even when the invocations use shared data, - because all references to the shared data are serialized. - \li A \e reentrant function can also be called simultaneously from - multiple threads, but only if each invocation uses its own data. - \endlist - - Hence, a \e{thread-safe} function is always \e{reentrant}, but a - \e{reentrant} function is not always \e{thread-safe}. - - By extension, a class is said to be \e{reentrant} if its member - functions can be called safely from multiple threads, as long as - each thread uses a \e{different} instance of the class. The class - is \e{thread-safe} if its member functions can be called safely - from multiple threads, even if all the threads use the \e{same} - instance of the class. - - \note Qt classes are only documented as \e{thread-safe} if they - are intended to be used by multiple threads. If a function is not - marked as thread-safe or reentrant, it should not be used from - different threads. If a class is not marked as thread-safe or - reentrant then a specific instance of that class should not be - accessed from different threads. - - \section1 Reentrancy - - C++ classes are often reentrant, simply because they only access - their own member data. Any thread can call a member function on an - instance of a reentrant class, as long as no other thread can call - a member function on the \e{same} instance of the class at the - same time. For example, the \c Counter class below is reentrant: - - \snippet threads/threads.cpp 3 - \snippet threads/threads.cpp 4 - - The class isn't thread-safe, because if multiple threads try to - modify the data member \c n, the result is undefined. This is - because the \c ++ and \c -- operators aren't always atomic. - Indeed, they usually expand to three machine instructions: - - \list 1 - \li Load the variable's value in a register. - \li Increment or decrement the register's value. - \li Store the register's value back into main memory. - \endlist - - If thread A and thread B load the variable's old value - simultaneously, increment their register, and store it back, they - end up overwriting each other, and the variable is incremented - only once! - - \section1 Thread-Safety - - Clearly, the access must be serialized: Thread A must perform - steps 1, 2, 3 without interruption (atomically) before thread B - can perform the same steps; or vice versa. An easy way to make - the class thread-safe is to protect all access to the data - members with a QMutex: - - \snippet threads/threads.cpp 5 - \snippet threads/threads.cpp 6 - - The QMutexLocker class automatically locks the mutex in its - constructor and unlocks it when the destructor is invoked, at the - end of the function. Locking the mutex ensures that access from - different threads will be serialized. The \c mutex data member is - declared with the \c mutable qualifier because we need to lock - and unlock the mutex in \c value(), which is a const function. - - \section1 Notes on Qt Classes - - Many Qt classes are \e{reentrant}, but they are not made - \e{thread-safe}, because making them thread-safe would incur the - extra overhead of repeatedly locking and unlocking a QMutex. For - example, QString is reentrant but not thread-safe. You can safely - access \e{different} instances of QString from multiple threads - simultaneously, but you can't safely access the \e{same} instance - of QString from multiple threads simultaneously (unless you - protect the accesses yourself with a QMutex). - - Some Qt classes and functions are thread-safe. These are mainly - the thread-related classes (e.g. QMutex) and fundamental functions - (e.g. QCoreApplication::postEvent()). - - \note Terminology in the multithreading domain isn't entirely - standardized. POSIX uses definitions of reentrant and thread-safe - that are somewhat different for its C APIs. When using other - object-oriented C++ class libraries with Qt, be sure the - definitions are understood. -*/ - -/*! - \page threads-qobject.html - \title Threads and QObjects - - \previouspage Reentrancy and Thread Safety - \contentspage Thread Support in Qt - \nextpage Thread-Support in Qt Modules - - QThread inherits QObject. It emits signals to indicate that the - thread started or finished executing, and provides a few slots as - well. - - More interesting is that \l{QObject}s can be used in multiple - threads, emit signals that invoke slots in other threads, and - post events to objects that "live" in other threads. This is - possible because each thread is allowed to have its own event - loop. - - \section1 QObject Reentrancy - - QObject is reentrant. Most of its non-GUI subclasses, such as - QTimer, QTcpSocket, QUdpSocket and QProcess, are also - reentrant, making it possible to use these classes from multiple - threads simultaneously. Note that these classes are designed to be - created and used from within a single thread; creating an object - in one thread and calling its functions from another thread is not - guaranteed to work. There are three constraints to be aware of: - - \list - \li \e{The child of a QObject must always be created in the thread - where the parent was created.} This implies, among other - things, that you should never pass the QThread object (\c - this) as the parent of an object created in the thread (since - the QThread object itself was created in another thread). - - \li \e{Event driven objects may only be used in a single thread.} - Specifically, this applies to the \l{timers.html}{timer - mechanism} and the \l{QtNetwork}{network module}. For example, - you cannot start a timer or connect a socket in a thread that - is not the \l{QObject::thread()}{object's thread}. - - \li \e{You must ensure that all objects created in a thread are - deleted before you delete the QThread.} This can be done - easily by creating the objects on the stack in your - \l{QThread::run()}{run()} implementation. - \endlist - - Although QObject is reentrant, the GUI classes, notably QWidget - and all its subclasses, are not reentrant. They can only be used - from the main thread. As noted earlier, QCoreApplication::exec() - must also be called from that thread. - - In practice, the impossibility of using GUI classes in other - threads than the main thread can easily be worked around by - putting time-consuming operations in a separate worker thread and - displaying the results on screen in the main thread when the - worker thread is finished. This is the approach used for - implementing the \l{Mandelbrot Example} and - the \l{network/blockingfortuneclient}{Blocking Fortune Client} - example. - - \section1 Per-Thread Event Loop - - Each thread can have its own event loop. The initial thread - starts its event loops using QCoreApplication::exec(); other - threads can start an event loop using QThread::exec(). Like - QCoreApplication, QThread provides an - \l{QThread::exit()}{exit(int)} function and a - \l{QThread::quit()}{quit()} slot. - - An event loop in a thread makes it possible for the thread to use - certain non-GUI Qt classes that require the presence of an event - loop (such as QTimer, QTcpSocket, and QProcess). It also makes it - possible to connect signals from any threads to slots of a - specific thread. This is explained in more detail in the - \l{Signals and Slots Across Threads} section below. - - \image threadsandobjects.png Threads, objects, and event loops - - A QObject instance is said to \e live in the thread in which it - is created. Events to that object are dispatched by that thread's - event loop. The thread in which a QObject lives is available using - QObject::thread(). - - Note that for QObjects that are created before QApplication, - QObject::thread() returns zero. This means that the main thread - will only handle posted events for these objects; other event - processing is not done at all for objects with no thread. Use the - QObject::moveToThread() function to change the thread affinity for - an object and its children (the object cannot be moved if it has a - parent). - - Calling \c delete on a QObject from a thread other than the one - that \e owns the object (or accessing the object in other ways) is - unsafe, unless you guarantee that the object isn't processing - events at that moment. Use QObject::deleteLater() instead, and a - \l{QEvent::DeferredDelete}{DeferredDelete} event will be posted, - which the event loop of the object's thread will eventually pick - up. By default, the thread that \e owns a QObject is the thread - that \e creates the QObject, but not after QObject::moveToThread() - has been called. - - If no event loop is running, events won't be delivered to the - object. For example, if you create a QTimer object in a thread but - never call \l{QThread::exec()}{exec()}, the QTimer will never emit - its \l{QTimer::timeout()}{timeout()} signal. Calling - \l{QObject::deleteLater()}{deleteLater()} won't work - either. (These restrictions apply to the main thread as well.) - - You can manually post events to any object in any thread at any - time using the thread-safe function - QCoreApplication::postEvent(). The events will automatically be - dispatched by the event loop of the thread where the object was - created. - - Event filters are supported in all threads, with the restriction - that the monitoring object must live in the same thread as the - monitored object. Similarly, QCoreApplication::sendEvent() - (unlike \l{QCoreApplication::postEvent()}{postEvent()}) can only - be used to dispatch events to objects living in the thread from - which the function is called. - - \section1 Accessing QObject Subclasses from Other Threads - - QObject and all of its subclasses are not thread-safe. This - includes the entire event delivery system. It is important to keep - in mind that the event loop may be delivering events to your - QObject subclass while you are accessing the object from another - thread. - - If you are calling a function on an QObject subclass that doesn't - live in the current thread and the object might receive events, - you must protect all access to your QObject subclass's internal - data with a mutex; otherwise, you may experience crashes or other - undesired behavior. - - Like other objects, QThread objects live in the thread where the - object was created -- \e not in the thread that is created when - QThread::run() is called. It is generally unsafe to provide slots - in your QThread subclass, unless you protect the member variables - with a mutex. - - On the other hand, you can safely emit signals from your - QThread::run() implementation, because signal emission is - thread-safe. - - \section1 Signals and Slots Across Threads - - Qt supports these signal-slot connection types: - - \list - - \li \l{Qt::AutoConnection}{Auto Connection} (default) If the signal is - emitted in the thread which the receiving object has affinity then - the behavior is the same as the Direct Connection. Otherwise, - the behavior is the same as the Queued Connection." - - \li \l{Qt::DirectConnection}{Direct Connection} The slot is invoked - immediately, when the signal is emitted. The slot is executed - in the emitter's thread, which is not necessarily the - receiver's thread. - - \li \l{Qt::QueuedConnection}{Queued Connection} The slot is invoked - when control returns to the event loop of the receiver's - thread. The slot is executed in the receiver's thread. - - \li \l{Qt::BlockingQueuedConnection}{Blocking Queued Connection} - The slot is invoked as for the Queued Connection, except the - current thread blocks until the slot returns. \note Using this - type to connect objects in the same thread will cause deadlock. - - \li \l{Qt::UniqueConnection}{Unique Connection} The behavior is the - same as the Auto Connection, but the connection is made only if - it does not duplicate an existing connection. i.e., if the same - signal is already connected to the same slot for the same pair - of objects, then the connection is not made and connect() - returns \c false. - - \endlist - - The connection type can be specified by passing an additional - argument to \l{QObject::connect()}{connect()}. Be aware that - using direct connections when the sender and receiver live in - different threads is unsafe if an event loop is running in the - receiver's thread, for the same reason that calling any function - on an object living in another thread is unsafe. - - QObject::connect() itself is thread-safe. - - The \l{Mandelbrot Example} uses a queued - connection to communicate between a worker thread and the main - thread. To avoid freezing the main thread's event loop (and, as a - consequence, the application's user interface), all the - Mandelbrot fractal computation is done in a separate worker - thread. The thread emits a signal when it is done rendering the - fractal. - - Similarly, the \l{network/blockingfortuneclient}{Blocking Fortune - Client} example uses a separate thread for communicating with - a TCP server asynchronously. -*/ - -/*! - \page threads-modules.html - \title Thread-Support in Qt Modules - - \previouspage Threads and QObjects - \contentspage Thread Support in Qt - - \section1 Threads and the SQL Module - - A connection can only be used from within the thread that created it. - Moving connections between threads or creating queries from a different - thread is not supported. - - In addition, the third party libraries used by the QSqlDrivers can impose - further restrictions on using the SQL Module in a multithreaded program. - Consult the manual of your database client for more information - - \section1 Painting in Threads - - QPainter can be used in a thread to paint onto QImage, QPrinter, and - QPicture paint devices. Painting onto QPixmaps and QWidgets is \e not - supported. On Mac OS X the automatic progress dialog will not be - displayed if you are printing from outside the GUI thread. - - Any number of threads can paint at any given time, however only - one thread at a time can paint on a given paint device. In other - words, two threads can paint at the same time if each paints onto - separate QImages, but the two threads cannot paint onto the same - QImage at the same time. - - \section1 Threads and Rich Text Processing - - The QTextDocument, QTextCursor, and \l{richtext.html}{all related classes} are reentrant. - - Note that a QTextDocument instance created in the GUI thread may - contain QPixmap image resources. Use QTextDocument::clone() to - create a copy of the document, and pass the copy to another thread for - further processing (such as printing). - - \section1 Threads and the SVG module - - The QSvgGenerator and QSvgRenderer classes in the QtSvg module - are reentrant. - - \section1 Threads and Implicitly Shared Classes - - Qt uses an optimization called \l{implicit sharing} for many of - its value class, notably QImage and QString. Beginning with Qt 4, - implicit shared classes can safely be copied across threads, like - any other value classes. They are fully - \l{Reentrancy and Thread-Safety}{reentrant}. The implicit sharing - is really \e implicit. - - In many people's minds, implicit sharing and multithreading are - incompatible concepts, because of the way the reference counting - is typically done. Qt, however, uses atomic reference counting to - ensure the integrity of the shared data, avoiding potential - corruption of the reference counter. - - Note that atomic reference counting does not guarantee - \l{Reentrancy and Thread-Safety}{thread-safety}. Proper locking should be used - when sharing an instance of an implicitly shared class between - threads. This is the same requirement placed on all - \l{Reentrancy and Thread-Safety}{reentrant} classes, shared or not. Atomic reference - counting does, however, guarantee that a thread working on its - own, local instance of an implicitly shared class is safe. We - recommend using \l{Signals and Slots Across Threads}{signals and - slots} to pass data between threads, as this can be done without - the need for any explicit locking. - - To sum it up, implicitly shared classes in Qt 4 are really \e - implicitly shared. Even in multithreaded applications, you can - safely use them as if they were plain, non-shared, reentrant - value-based classes. -*/ diff --git a/src/xml/doc/qtxml.qdocconf b/src/xml/doc/qtxml.qdocconf index 19561af57f..7f8fddfd11 100644 --- a/src/xml/doc/qtxml.qdocconf +++ b/src/xml/doc/qtxml.qdocconf @@ -27,7 +27,7 @@ qhp.QtXml.subprojects.classes.sortPages = true tagfile = ../../../doc/qtxml/qtxml.tags -depends += qtcore qtnetwork +depends += qtcore qtnetwork qtdoc headerdirs += ..