Skip to content
Why Is It Called 'Race Condition'? — The Origin of the Term

Why Is It Called 'Race Condition'? — The Origin of the Term

DodaTech Updated Jun 20, 2026 4 min read

Two processes sprint toward the same memory location. Neither knows the other exists. The winner determines what happens next. The loser’s result is overwritten, ignored, lost. The outcome depends entirely on which one gets there first — a race, pure and simple. And like any race, it can be unpredictable, unfair, and occasionally catastrophic.

The Story

The term “race condition” entered computing from electrical engineering, where it described circuits whose behavior depended on the timing of signals. In the 1960s, as batch processing systems gave way to time-sharing and multitasking, programmers encountered the same phenomenon at the software level.

A race condition occurs when two or more concurrent threads or processes access shared data without proper synchronization, and the final result depends on the precise timing of their execution. The “race” is between the competing operations — which one reads first, which one writes last.

The classic example is a bank account:

Thread A: balance = balance + 100
Thread B: balance = balance - 50

If both threads read the balance simultaneously, both get the same starting value (say, 1000). Thread A adds 100 (computes 1100). Thread B subtracts 50 (computes 950). Then they both write their result. The final balance depends entirely on which write happens last: either 1100 (A wins) or 950 (B wins). The correct answer — 1050 — never appears.

The racing metaphor is exact. In a foot race, runners start at the same point and race to a finish line. The outcome depends on who arrives first. In a race condition, processes start from the same state and race to modify it. The outcome depends on whose modification “finishes” last.

How It Evolved

Race conditions became a central concern of concurrent programming as systems grew more complex. The term now applies to any scenario where timing-dependent behavior produces incorrect results. Some infamous examples:

Therac-25 (1985-1987): A radiation therapy machine that killed four patients due to a race condition in its control software. If the operator made rapid edits to the treatment plan, a race between the display update and the dose calculation caused the machine to deliver lethal radiation. The final result depended on keystroke timing — something no operator could control.

Northeast Blackout (2003): A race condition in General Electric’s energy management system caused the alarm system to fail after a power line tripped. Operators didn’t receive critical alerts, the cascade wasn’t stopped, and 55 million people lost power across the northeastern US and Canada. One of the contributing factors was a software race in the alarm handling logic.

Mars Pathfinder (1997): Shortly after landing on Mars, the Pathfinder rover experienced system resets caused by a priority inversion — a form of race condition where a high-priority task waits for a low-priority task that a medium-priority task has preempted. Engineers diagnosed and fixed it from Earth by changing the priority inheritance protocol.

Did You Know?

Race conditions are notoriously hard to debug because they’re timing-dependent. A bug that crashes the system 1 in 10,000 runs might never appear during testing and then strike in production. Adding debugging code changes the timing and often makes the race disappear — the “Heisenbug” effect (named after Heisenberg’s uncertainty principle).

Not all races are buggy. Intentionally benign races exist in concurrent algorithms. For example, lock-free data structures use compare-and-swap (CAS) operations in a loop, racing until one succeeds. The race is the mechanism, not the error.

The “data race” (two threads accessing the same memory without synchronization) is a specific type of race condition. Every data race is a race condition, but not every race condition involves a data race — some involve higher-level ordering constraints.

FAQ

How can race conditions be prevented?
Use synchronization primitives: mutexes, semaphores, atomic operations, or higher-level constructs like channels (Go) or actors (Erlang). The key is to ensure that access to shared data is mutually exclusive — only one thread at a time can modify critical state.
Are race conditions possible in single-threaded programs?
Yes, if the program uses signal handlers, callbacks, or event loops with reentrant code. A signal can interrupt your code at any point, and if the signal handler modifies the same data, you have a race condition — even with one thread.

Related Etymologies

Why Is It Called 'Mutex'?

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro