线程安全函数与信号处理详解
1. 线程安全函数概述
在多线程编程中,线程安全是一个至关重要的概念。虽然 ANSI C 和 POSIX 1003.1 - 1990 在设计时并未考虑线程,但它们定义的大多数函数可以在不改变外部接口的情况下实现线程安全。例如,malloc和free函数为了支持线程需要进行内部修改,但调用这些函数的代码无需感知这些变化。当调用malloc时,它会锁定一个互斥量(或多个互斥量)来执行操作,或者使用其他等效的同步机制。
然而,有两类函数无法通过这种方式实现线程安全:
-返回内部静态缓冲区指针的函数:例如asctime,由于调用者会在函数返回后(此时互斥量已解锁)读取格式化的时间字符串,因此内部互斥量无法解决问题。
-需要在一系列调用之间保持静态上下文的函数:例如strtok,它将当前位置存储在本地静态变量中,使用互斥量无法避免其他线程在两次调用之间覆盖当前位置。
为了解决这些问题,Pthreads 定义了现有函数的线程安全变体,这些函数名以 “_ r” 结尾。这些变体将上下文移到库外部,由调用者控制。当每个线程使用私有缓冲区或上下文时,这些函数就是线程安全的。如果需要在线程之间共享上下文,调用者必须提供同步机制。
2. 具体的线程安全函数
2.1 用户和终端标识
以下是一些用于获取用户和终端标识的线程安全函数: