Race Conditions in Concurrency

Sep 13, 2025

Overview

This lecture explains race conditions in concurrent programming, demonstrates their causes, and examines software-only solutions—highlighting why reliable prevention ultimately demands hardware support for atomic operations.

Understanding Race Conditions

  • A race condition occurs when multiple threads access and modify shared data concurrently, leading to unpredictable results.
  • Even simple actions like counter = counter + 1 are not atomic; they're broken into multiple CPU instructions.
  • Non-atomic operations can be interrupted mid-way, causing threads to read outdated values and corrupt shared state.
  • Concurrency means multiple programs share CPU time, creating the illusion of parallel execution.
  • The critical section is the part of code where shared data is at risk of concurrent modification.

Identifying and Preventing Race Conditions

  • Critical sections must be protected to avoid simultaneous access by multiple threads.
  • Mutual exclusion ensures only one thread enters the critical section at a time.
  • Naive solutions, such as using a shared flag variable to control access, often create new race conditions.

Peterson's Algorithm

  • Uses two shared variables: turn (whose turn it is) and a flag array (thread intent to enter).
  • Each thread sets its flag, gives turn to the other, and spin-waits until the other is out.
  • Peterson's Algorithm achieves mutual exclusion, progress, and bounded waiting in theory.
  • Minor delays or outdated reads only cause extra spin-wait, not logic errors in the intended model.

Why Software-Only Solutions Fail

  • Compilers may reorder instructions for optimization, breaking assumptions in synchronization code.
  • CPUs also reorder instructions during execution for efficiency (CPU pipelining and out-of-order execution).
  • Multi-core and multi-cache architectures can cause threads to see stale values in shared variables.
  • These hardware-level behaviors make purely software-based mutual exclusion unreliable.

Reliable Solutions: Hardware Support

  • Hardware-provided atomic operations are needed to ensure correct synchronization.
  • Atomic operations prevent compiler or CPU reordering and guarantee visibility across cores.
  • Purely software approaches like Peterson’s are not reliable on modern hardware.

Key Terms & Definitions

  • Race Condition — bug where outcome depends on unpredictable ordering of thread execution.
  • Atomic Operation — an indivisible operation that completes in a single step without interruption.
  • Critical Section — code segment where shared data may be concurrently accessed or modified.
  • Mutual Exclusion — property ensuring only one thread can enter the critical section at a time.
  • Spin Wait (Spinlock) — thread repeatedly checks a condition, waiting for permission to enter a critical section.
  • Peterson’s Algorithm — classic software-only algorithm for mutual exclusion using flags and a turn variable.

Action Items / Next Steps

  • Expect future lectures to cover thread synchronization and atomic hardware instructions in detail.
  • Review race condition concepts and be cautious about relying solely on software for mutual exclusion.