How Concurrency Connects to Everything Else

This domain reasons about coordination; other domains own the mechanisms it coordinates. Each row names the concurrency-side concept, the concept it maps onto elsewhere, and why the depth lives there rather than here — including two domains that do not exist yet and are carried as context instead of dead links.

Operating Systems

The thread blocked on the mutexMutexes and process statesOpen →

This domain decides which region the lock goes around; OS explains what blocking does to the thread and who wakes it.

Enumerating interleavingsRace conditionsOpen →

OS defines what a race is. Here you find the specific schedule that breaks your invariant.

Choosing the critical sectionCritical sectionsOpen →

OS explains what a critical section is; this domain is about picking the smallest one that still holds the invariant.

The event loop stalledThe event loopOpen →

The loop's mechanics — the phases, the poll, the callback queue — are taught there. Here it is what stalling costs everyone else.

Async task suspended on I/OBlocking, non-blocking, multiplexed, asynchronousOpen →

Whether await actually releases the thread depends on which I/O model is underneath.

Context switch costContext switchingOpen →

Oversubscription is expensive because switching is expensive — the register save, the TLB and cache damage are the OS story.

Thread versus process choiceProcess versus threadOpen →

The address-space difference is the OS fact; the design consequence is this domain's subject.

Semaphores and condition variablesSemaphores and condition variablesOpen →

The primitives and their kernel support live there; permits as a capacity limit live here.

Thread-per-request serversThe thread pool serverOpen →

The concrete server built around a pool is the OS walkthrough; choosing between models is this domain's decision.

Deadlock in a wait-for graphDeadlocksOpen →

The four conditions and detection algorithms are OS material; here they become a lock-ordering rule you can enforce in review.

Observability & Performance

Low CPU, high latencyLock contentionOpen →

Perf teaches how to diagnose contention from signals; this domain teaches why it happens and how to reduce it.

Deciding the concurrency limitConcurrency limitsOpen →

The server-side signal that you are past the limit is a perf topic; choosing the number is a design decision here.

Is this work CPU- or I/O-bound?CPU-bound vs I/O-boundOpen →

Perf diagnoses it from utilization and traces; this domain classifies it to pick an execution model.

The queue grew without boundQueueingOpen →

Queueing theory explains why latency explodes before throughput does; backpressure is the design response.

Twenty workers, five hundred waitingWorker pool saturationOpen →

The saturation signal and its arithmetic; pool sizing and the overflow policy are decided here.

Event-loop lagEvent-loop lagOpen →

The metric that reveals a blocked loop before users notice — the leading indicator for blocking-the-event-loop.

A thousand callers miss the same keyCache stampedeOpen →

The perf lesson names the incident; single-flight coalescing is the concurrency pattern that prevents it.

Sequential awaits in a handlerSequential or parallelOpen →

Same work, different latency — the waterfall shape that makes the sequential-await trap visible in a trace.

The pool was sized at 20 and 980 waitedConnection pool saturationOpen →

Waiting in front of an idle database is the canonical case of a limit set in the wrong place.

Database Engineering

Two transactions lost an updateLocks and deadlocksOpen →

The database solves concurrency for its own data with its own lock manager — and not for your application memory.

Optimistic control against a rowMVCCOpen →

Versions and snapshots are how a database implements optimism; the retry loop in your code is the other half.

What does the database actually guarantee?Isolation levelsOpen →

Read committed does not stop lost updates. Knowing which anomaly the level permits decides whether you need your own control.

A cycle in the waits-for graphDeadlock detectionOpen →

Databases detect and abort a victim. Your process does not — which is why lock ordering is prevention, not detection.

UPDATE under concurrent writersUPDATE, DELETE and dead tuplesOpen →

What actually happens to two concurrent updates of the same row, at the engine level.

Software Architecture

The queue between producer and consumerMessage queuesOpen →

Architecture decides that the work should be asynchronous; this domain runs the queue and bounds it.

A full queue must push backBackpressureOpen →

Backpressure as an architectural property across services; here it is the bound on one in-process queue.

Retrying a cancelled operationIdempotencyOpen →

Cancellation and retry both mean an operation may be attempted more than once, so it had better be safe to repeat.

Request/response or eventsRequest/response vs event-drivenOpen →

Whether a call is synchronous is an architecture decision that determines the concurrency model available to you.

Computer Architecture

Atomics compile to a CPU instructionAtomic instructionsOpen →

What the hardware actually guarantees for a compare-and-swap, and what it costs on the bus.

Two counters in one cache lineFalse sharingOpen →

Independent variables that share a line ping-pong between cores — a hardware effect with a software fix.

Will the other thread see my write?Memory orderingOpen →

Loads and stores are reordered by the compiler and the CPU. The language memory model is the contract on top of this.

A release barrier before publishingMemory barriersOpen →

Barriers order, they do not flush — the distinction that makes safe publication make sense.

Shared memory across coresCache coherenceOpen →

Coherence is what makes shared memory work at all, and coherence traffic is what makes contended atomics slow.

One instruction, many elementsSIMDOpen →

Data parallelism inside a single core, underneath the parallel algorithms this domain decomposes.

Not all memory is equally farNUMAOpen →

On a multi-socket machine, which core touches which memory changes the speedup you get from more threads.

Pinning a thread to a coreThread affinityOpen →

Affinity preserves cache warmth and costs scheduling flexibility — the trade this domain has to make consciously.

Cores versus hardware threadsCore, hardware thread, software threadOpen →

Pool sizing starts from a core count, and "16 CPUs" in a container often means neither 16 cores nor 16 anything.

Agentic AI Engineering

The agent ran three tools at onceParallel vs sequential tool callsOpen →

Whether tool calls may overlap is an agent-design question; whether they race on the same resource is this one.

A tool call timed out mid-runTool errors, retries and timeoutsOpen →

A retried tool call is a second attempt at a side effect — the same problem as a cancelled task that did not stop.

Cloud & Infrastructure

A pool of 20 against a managed databaseManaged databasesOpen →

Your per-instance connection limit multiplied by your instance count is the number the database actually sees.

Draining in-flight work on deployGraceful shutdownOpen →

Concurrent shutdown — stop intake, drain with a deadline, cancel the rest — is what makes a rollout not drop requests.

API Design

Version checks on a writeOptimistic concurrencyOpen →

The HTTP contract — ETag, If-Match, 412 — is the API side; the retry loop and its livelock risk are here.

A slow consumer of your streamSlow clients and backpressureOpen →

Backpressure across a network boundary, where the queue you cannot see belongs to somebody else.

Algorithms & Data Structures

Splitting work to run in parallelDivide and conquerOpen →

Fork/join is divide-and-conquer with the subproblems handed to different cores; the recursion is the same.

A parallel prefix scanPrefix sumOpen →

The canonical case where a sequential-looking dependency turns out to be parallelisable in logarithmic span.