Suggested Ways to Teach the Art of Multiprocessor Programming
1.1 Shared Objects and Synchronization
1.3 The Producer–Consumer Problem
1.4 The Readers–Writers Problem
1.5 The Harsh Realities of Parallelization
2.6 Lamport’s Bakery Algorithm
2.8 Lower Bounds on the Number of Locations
3.1 Concurrency and Correctness
4. Foundations of Shared Memory
5. The Relative Power of Primitive Synchronization Operations
5.5 Multiple Assignment Objects
5.6 Read–Modify–Write Operations
5.8 The compareAndSet() Operation
6.3 A Lock-Free Universal Construction
6.4 A Wait-Free Universal Construction
7.3 TAS-Based Spin Locks Revisited
7.6 A Queue Lock with Timeouts
8. Monitors and Blocking Synchronization
8.2 Monitor Locks and Conditions
9.4 Coarse-Grained Synchronization
9.5 Fine-Grained Synchronization
9.6 Optimistic Synchronization
9.8 Non-Blocking Synchronization
10. Concurrent Queues and the ABA Problem
10.5 An Unbounded Lock-Free Queue
10.6 Memory Reclamation and the ABA Problem
11. Concurrent Stacks and Elimination
11.2 An Unbounded Lock-Free Stack
11.4 The Elimination Backoff Stack
12. Counting, Sorting, and Distributed Coordination
12.4 Quiescently Consistent Pools and Counters
12.10 Distributed Coordination
13. Concurrent Hashing and Natural Parallelism
13.4 An Open-Addressed Hash Set
14. Skiplists and Balanced Search
14.3 A Lock-Based Concurrent Skiplist
14.4 A Lock-Free Concurrent Skiplist
15.2 An Array-Based Bounded Priority Queue
15.3 A Tree-Based Bounded Priority Queue
15.4 An Unbounded Heap-Based Priority Queue
15.5 A Skiplist-Based Unbounded Priority Queue
16. Futures, Scheduling, and Work Distribution
16.3 Realistic Multiprocessor Scheduling
17.6 Termination Detecting Barriers
18.2 Transactions and Atomicity
18.3 Software Transactional Memory
18.212.102.174