多线程编程指南

getcputc 的替代项

标准 I/O 也会出现问题。程序员习惯使用例程(如 getc(3C)putc(3C)),这些例程以宏方式实现,且速度非常快。由于 getc(3C)putc(3C) 的速度较快,因此可以在程序的内部循环中使用这些宏,而不必担心效率。

但是,将 getc(3C)putc(3C) 设为线程安全时,宏的使用代价会突然变高。现在,宏至少需要两个内部子例程调用来锁定和解除锁定互斥。

为避开此问题,提供了这些例程的替代版本 getc_unlocked(3C)putc_unlocked(3C)

getc_unlocked(3C)putc_unlocked(3C) 不会获得对互斥的锁定。这些宏的速度像原始非线程安全版本的 getc(3C)putc(3C) 一样快。

但是,要采用线程安全方式使用这些宏,必须使用 flockfile(3C)funlockfile(3C) 显式锁定和释放保护标准 I/O 流的互斥。对其中靠后例程的调用是在循环外进行的。对 getc_unlocked()putc_unlocked() 的调用是在循环内进行的。