Preface What this book covers What you need for this book Who this book is for Conventions Reader feedback Downloading the example code Errata Piracy Questions Revisiting Multithreading Getting started The multithreaded application Makefile Other applications Summary Multithreading Implementation on the Processor and OS Defining processes and threads Tasks in x86 (32-bit and 64-bit) Process state in ARM The stack Defining multithreading Flynn's taxonomy Symmetric versus asymmetric multiprocessing Loosely and tightly coupled multiprocessing Combining multiprocessing with multithreading Multithreading types Temporal multithreading Simultaneous multithreading (SMT) Schedulers Tracing the demo application Mutual exclusion implementations Hardware Software Summary C++ Multithreading APIs API overview POSIX threads Windows support PThreads thread management Mutexes Condition variables Synchronization Semaphores Thread local storage (TLC) Windows threads Thread management Advanced management Synchronization Condition variables Thread local storage Boost Qt QThread Thread pools Synchronization QtConcurrent Thread local storage POCO Thread class Thread pool Thread local storage (TLS) Synchronization C++ threads Putting it together Summary Thread Synchronization and Communication Safety first The scheduler High-level view Implementation Request class Worker class Dispatcher Makefile Output Sharing data Using r/w-locks Using shared pointers Summary Native C++ Threads and Primitives The STL threading API Boost.Thread API The 2011 standard C++14 C++17 STL organization Thread class Basic use Passing parameters Return value Moving threads Thread ID Sleeping Yield Detach Swap Mutex Basic use Non-blocking locking Timed mutex Lock guard Unique lock Scoped lock Recursive mutex Recursive timed mutex Shared mutex Shared timed mutex Condition variable Condition_variable_any Notify all at thread exit Future Promise Shared future Packaged_task Async Launch policy Atomics Summary Debugging Multithreaded Code When to start debugging The humble debugger GDB Debugging multithreaded code Breakpoints Back traces Dynamic analysis tools Limitations Alternatives Memcheck Basic use Error types Illegal read / illegal write errors Use of uninitialized values Uninitialized or unaddressable system call values Illegal frees Mismatched deallocation Overlapping source and destination Fishy argument values Memory leak detection Helgrind Basic use Misuse of the pthreads API Lock order problems Data races DRD Basic use Features C++11 threads support Summary Best Practices Proper multithreading Wrongful expectations - deadlocks Being careless - data races Mutexes aren't magic Locks are fancy mutexes Threads versus the future Static order of initialization Summary Atomic Operations - Working with the Hardware Atomic operations Visual C++ GCC Memory order Other compilers C++11 atomics Example Non-class functions Example Atomic flag Memory order Relaxed ordering Release-acquire ordering Release-consume ordering Sequentially-consistent ordering Volatile keyword Summary Multithreading with Distributed Computing Distributed computing, in a nutshell MPI Implementations Using MPI Compiling MPI applications The cluster hardware Installing Open MPI Linux and BSDs Windows Distributing jobs across nodes Setting up an MPI node Creating the MPI host file Running the job Using a cluster scheduler MPI communication MPI data types Custom types Basic communication Advanced communication Broadcasting Scattering and gathering MPI versus threads Potential issues Summary Multithreading with GPGPU The GPGPU processing model Implementations OpenCL Common OpenCL applications OpenCL versions OpenCL 1.0 OpenCL 1.1 OpenCL 1.2 OpenCL 2.0 OpenCL 2.1 OpenCL 2.2 Setting up a development environment Linux Windows OS X/MacOS A basic OpenCL application GPU memory management GPGPU and multithreading Latency Potential issues Debugging GPGPU applications Summary