pthread_cond_wait only waits for signal happens after. So, the correct sequence is: thread 1 waits (suspends) thread 2 signals thread 1 proceeds. In your scenario: thread 2 signals (which makes you assume thread 1 should return immediately from a subsequent wait) thread 1 waits (suspends indefinitely until next time thread 2 signals) For more information, refer to pthread reference.