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

getc(3S) と putc(3S) の代替

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

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

この問題を回避するために、これらの代替マクロとして getc_unlocked(3S)putc_unlocked(3S) が提供されています。

これらの代替マクロは mutex をロックしないので、スレッドに対して安全ではないオリジナルの getc(3S)putc(3S) と同程度に高速です。

しかし、それらをスレッドに対して安全な方法で使うためには、標準入出力ストリームを保護する mutex を flockfile(3S)funlockfile(3S) で明示的にロックまたは解除しなければなりません。ループの外側を flockfile()funlockfile() で囲み、ループの内側で getc_unlocked()putc_unlocked() を呼び出します。