ebook img

Concurrency with Modern C++ PDF

475 Pages·2019·7.99 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Concurrency with Modern C++

Concurrency with Modern C++ What every professional C++ programmer should know about concurrency. Rainer Grimm Thisbookisforsaleathttp://leanpub.com/concurrencywithmodernc Thisversionwaspublishedon2019-03-19 ThisisaLeanpubbook.LeanpubempowersauthorsandpublisherswiththeLeanPublishing process.LeanPublishingistheactofpublishinganin-progressebookusinglightweighttoolsand manyiterationstogetreaderfeedback,pivotuntilyouhavetherightbookandbuildtractiononce youdo. ©2017-2019RainerGrimm Tweet This Book! PleasehelpRainerGrimmbyspreadingthewordaboutthisbookonTwitter! Thesuggestedhashtagforthisbookis#rainer_grimm. Findoutwhatotherpeoplearesayingaboutthebookbyclickingonthislinktosearchforthis hashtagonTwitter: #rainer_grimm Contents ReaderTestimonials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii SpecialFonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii SpecialSymbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii SpecialBoxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv SourceCode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv RunthePrograms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv Howyoushouldreadthebook? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v PersonalNotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v AboutMe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vi MySpecialCircumstances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vi A Quick Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ConcurrencywithModernC++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 C++11andC++14:TheFoundation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 MemoryModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Multithreading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 C++17:ParallelAlgorithmsoftheStandardTemplateLibrary . . . . . . . . . . . . . . . . . . 5 ExecutionPolicy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 NewAlgorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 CaseStudies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 CalculatingtheSumofaVector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Thread-SafeInitialisationofaSingleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 OngoingOptimisationwithCppMem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 C++20/23:TheConcurrentFuture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Executors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 std::jthread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 AtomicSmartPointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Extendedfutures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 CONTENTS LatchesandBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 TransactionalMemory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 TaskBlocks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 PatternsandBestPractices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 ConcurrentArchitecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 BestPractices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 DataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Challenges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 TimeLibrary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 CppMem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 The Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 MemoryModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 BasicsoftheMemoryModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Whatisamemorylocation? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Whathappensiftwothreadsaccessthesamememorylocation? . . . . . . . . . . . . . 14 TheContract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 TheFoundation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 TheChallenges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Atomics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 StrongversusWeakMemoryModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 TheAtomicFlag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 TheClassTemplatestd::atomic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 AllAtomicOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 FreeAtomicFunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 std::shared_ptr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 TheSynchronisationandOrderingConstraints . . . . . . . . . . . . . . . . . . . . . . . . . . 43 TheSixVariantsofMemoryOrderingsinC++ . . . . . . . . . . . . . . . . . . . . . . . . 43 SequentialConsistency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Acquire-ReleaseSemantic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 std::memory_order_consume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 RelaxedSemantic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Fences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 std::atomic_thread_fence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 std::atomic_signal_fence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Multithreading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 CONTENTS ThreadCreation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 ThreadLifetime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 ThreadArguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 SharedData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Mutexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Thread-safeInitialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Thread-LocalData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 ConditionVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 ThePredicate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 LostWakeupandSpuriousWakeup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 TheWaitWorkflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 TasksversusThreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 std::async . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 std::packaged_task . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 std::promiseandstd::future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 std::shared_future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 ParallelAlgorithmsoftheStandardTemplateLibrary . . . . . . . . . . . . . . . . . . . . . . . 157 ExecutionPolicies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 ParallelandVectorisedExecution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 HazardsofDataRacesandDeadlocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 TheNewAlgorithms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Moreoverloads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 ThefunctionalHeritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 CaseStudies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 CalculatingtheSumofaVector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 SingleThreadedadditionofaVector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 MultithreadedSummationwithaSharedVariable . . . . . . . . . . . . . . . . . . . . . . 183 Thread-LocalSummation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 SummationofaVector:TheConclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Thread-SafeInitialisationofaSingleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Double-CheckedLockingPattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 PerformanceMeasurement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Thread-SafeMeyersSingleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 CONTENTS std::lock_guard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 std::call_oncewithstd::once_flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Atomics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 PerformanceNumbersofthevariousThread-SafeSingletonImplementations . . . . . 215 OngoingOptimisationwithCppMem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 CppMem:Non-AtomicVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 CppMem:Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 CppMem:AtomicswithSequentialConsistency . . . . . . . . . . . . . . . . . . . . . . . 224 CppMem:AtomicswithAcquire-ReleaseSemantic . . . . . . . . . . . . . . . . . . . . . 232 CppMem:AtomicswithNon-atomics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 CppMem:AtomicswithRelaxedSemantic . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 TheFuture:C++20/23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Executors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 AlongWay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 WhatisanExecutor?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 FirstExamples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 GoalsofanExecutorConcept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 ExecutionFunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 APrototypeImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 ACooperativelyInterruptibleJoiningThread . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 AutomaticallyJoining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Interruptastd::jthread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 StopTokens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 AtomicSmartPointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 Athread-safesinglylinkedlist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 ExtendedFutures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 ConcurrencyTSv1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 UnifiedFutures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 LatchesandBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 std::latch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 std::barrier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 std::flex_barrier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 AGeneratorFunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 TransactionalMemory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 ACI(D) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 SynchronizedandAtomicBlocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 transaction_safeversustransaction_unsafeCode . . . . . . . . . . . . . . . . . . . . 292 TaskBlocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 CONTENTS ForkandJoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 define_task_blockversusdefine_task_block_restore_thread . . . . . . . . . . . . . 294 TheInterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 TheScheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .297 PatternsandBestPractices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 InvaluableValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 PatternversusBestPractices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 Anti-Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 SynchronisationPatterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 DealingwithSharing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 CopiedValue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 Thread-SpecificStorage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 Future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 DealingwithMutation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 ScopedLocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 StrategizedLocking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 Thread-SafeInterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 GuardedSuspension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 ConcurrentArchitecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 ActiveObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 AdvantagesandDisadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 FurtherInformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 MonitorObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Runtimebehaviour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 AdvantagesandDisadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 FurtherInformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 Half-Sync/Half-Async . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 AdvantagesandDisadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 Reactor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 Proactor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 FurtherInformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 BestPractices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 CONTENTS General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 CodeReviews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 MinimiseSharingofMutableData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 MinimiseWaiting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 PreferImmutableData. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 Usepurefunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 LookfortheRightAbstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 UseStaticCodeAnalysisTools. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 UseDynamicEnforcementTools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 Multithreading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 DataSharing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 ConditionVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 PromisesandFutures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 MemoryModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 Don’tusevolatileforsynchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 Don’tprogramLockFree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 IfyouprogramLock-Free,usewell-establishedpatterns . . . . . . . . . . . . . . . . . . 388 Don’tbuildyourabstraction,useguaranteesofthelanguage . . . . . . . . . . . . . . . 389 Don’treinventthewheel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .390 Lock-BasedDataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 Lock-FreeDataStructures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 Further Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .393 Challenges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 ABAProblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 BlockingIssues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 BreakingofProgramInvariants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 DataRaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 Deadlocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 FalseSharing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 LifetimeIssuesofVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 MovingThreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 RaceConditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 TheTimeLibrary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 TheInterplayofTimePoint,TimeDuration,andClock . . . . . . . . . . . . . . . . . . . . . 414 TimePoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 CONTENTS FromTimePointtoCalendarTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 CrossthevalidTimeRange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 TimeDuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 Calculations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 Clocks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 AccuracyandSteadiness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 Epoch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 SleepandWait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 CppMem-AnOverview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 ThesimplifiedOverview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 1.Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 2.Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 3.DisplayRelations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 4.DisplayLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 5.ModelPredicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 TheExamples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 ACID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 CAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 CallableUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 Concurrency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 CriticalSection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 EagerEvaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 Executor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 FunctionObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 LambdaFunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 Lazyevaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 Lock-free . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 LostWakeup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 MathLaws . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 MemoryLocation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 MemoryModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 ModificationOrder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 Monad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 Non-blocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 Parallelism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 Predicate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 RAII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 ReleaseSequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 SequentialConsistency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.