C++ Concurrency
Core Question
How do threads communicate?
- •Shared State: Mutexes (
std::mutex) or Atomics (std::atomic). - •Coordination: Condition Variables (
std::condition_variable) or Latches/Semaphores (C++20). - •Tasks:
std::asyncor Coroutines (C++20).
Error → Design Question
| Issue | Design Question |
|---|---|
| Data Race | Are two threads accessing memory without a Happens-Before edge? |
| Deadlock | Did you lock Mutex A then B, while another thread locked B then A? |
| False Sharing | Are independent atomics sitting on the same cache line? |
| Live Lock | Are threads spinning without progress? |
Thinking Prompt
- •
Do I need a thread?
- •Short task? →
std::asyncor Thread Pool. - •Long background? →
std::jthread.
- •Short task? →
- •
Is it shared state?
- •Yes? → Protect with
std::mutex. - •Is it small/primitive? →
std::atomic.
- •Yes? → Protect with
- •
Locks or Atomics?
- •Logic requiring multiple steps? → Mutex (Atomic is only for single instructions).
- •Simple flag/counter? → Atomic.
Trace Up / Down
- •Trace Up:
- •Issue: "Random update values in counter."
- •Cause:
counter++is Read-Modify-Write, not atomic. Data race. - •Fix:
std::atomic<int>.
Quick Reference
| Tool | C++ Version | Use When |
|---|---|---|
std::jthread | C++20 | Standard thread (auto-join). |
std::atomic | C++11 | Lock-free counters/flags. |
std::mutex | C++11 | Locking critical sections. |
std::shared_mutex | C++17 | Read-heavy workloads. |
std::latch | C++20 | Waiting for N tasks to start. |
co_await | C++20 | Async I/O (requires library). |