Skip to content

Condition Variable vs Semaphore

Semaphore

Worldview:

resource synchronization

Example:

filled
empty

State exists inside semaphore.


Condition Variable

Worldview:

condition synchronization

Example:

while (!predicate)
    pthread_cond_wait()

State exists outside condvar.


Predicate Loop

Correct:

while (!condition)
    wait()

Wrong:

if (!condition)
    wait()

Reason:

  • spurious wakeup
  • broadcast
  • race avoidance

Comparison

Item Semaphore Condvar
Store count Yes No
Store state Internal External
Queue Excellent Good
State machine Moderate Excellent
Timeout Yes Yes

Conclusion

Semaphore waits for resources.

Condition variable waits for state transitions.