ここのこのリンクでは、インクリメント関数で、実際にカウントを(ゼロから)インクリメントする前に条件変数が通知されます。カウントを増やした後にシグナルを呼び出さないでください。または、decrement_count関数の待機呼び出しは、increment_functionでミューテックスが解放されるまで戻りませんか?
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;
decrement_count()
{
pthread_mutex_lock(&count_lock);
while (count == 0)
pthread_cond_wait(&count_nonzero, &count_lock);
count = count - 1;
pthread_mutex_unlock(&count_lock);
}
increment_count()
{
pthread_mutex_lock(&count_lock);
if (count == 0)
pthread_cond_signal(&count_nonzero);
count = count + 1;
pthread_mutex_unlock(&count_lock);
}