Completions It can be tempting to use semaphores as event flags /* Wait for the data to arrive */ down(&data_semaphore); /* (somewhere else) */ /* Tell them the data is here */ up(&data_semaphore); This is not the best approach Semaphores are optimized for the no-wait case This usage always waits Race conditions are possible Use completions instead