マルチスレッドのプログラミング

getcputc の代替

標準入出力に関して、もう 1 つ問題があります。getc(3C)putc(3C) などのルーチンは、マクロとして実装されていて非常に高速に動作するという理由でよく使用されています。getc(3C)putc(3C) が高速であるため、これらのマクロは、プログラムのループ内でも効率を気にせずに使用できます。

しかし、getc(3C)putc(3C) は、スレッドに対して安全になるように変更されたため、以前よりも負荷が大きくなっています。これらのマクロは、相互排他のロックと解除のために、少なくとも 2 つの内部サブルーチンの呼び出しを必要とします。

この問題を回避するため、代替マクロとして getc_unlocked(3C) および putc_unlocked(3C) が用意されています。

getc_unlocked(3C)putc_unlocked(3C) は、相互排他ロックを獲得しません。これらの getc_unlocked() または putc_unlocked() マクロは、スレッドに対して安全ではない元の getc(3C) および putc(3C) と同程度の処理速度を実現しています。

しかし、これらのマクロをスレッドに対して安全な方法で使うためには、flockfile(3C) funlockfile(3C) を使って、標準入出力ストリームを保護する mutex を明示的にロックし、解放する必要があります。これらのルーチンは、ループの外で呼び出します。getc_unlocked()putc_unlocked() はループ内で呼び出します。