★で示したような記述を追加してしてみます。

void log_output(char* message)
{
..static char buf[256];
..time_t t;

..time(&t);

★..kz_getsem(ID);

..strcpy(buf,ctime(&t));
..strcpy(buf+strlen(buf),message);

..puts(buf);

★..kz_relsem(ID);
}


kz_getsem()は仕様として実現したいこととしてすでに別スレッドによってセマフォが獲得されていた場合は、その資源がロックされているとみなしスレッドをスリープ状態にして待ち合わせます。

セマフォは獲得・解放をカウンタで管理することで、複数のスレッドが再入する場合のスレッド数の上限を管理することができます。

上限が1のセマフォはバイナリ・セマフォ(ミューテックス)と呼ばれ、常にひとつのスレッドしか実行できないことになり、完全な排他ができます。