线程手册页 man(3C) 使用表 6–1 中列出的安全级别类别来描述接口对线程的支持程度。这些类别在 Intro(3) 手册页中进行了完整说明。
表 6–1 接口安全级别
类别 |
说明 |
---|---|
安全 |
可以从多线程应用程序中调用此代码 |
安全(包含异常) |
有关异常的说明,请参见对应手册页的 NOTES 部分。 |
不安全 |
此接口与多线程应用程序结合使用时是不安全的,除非应用程序一次仅安排在库中执行一个线程。 |
MT 安全 |
此接口已完全做好准备,可以执行多线程访问。此接口是安全的,而且支持一定的并发性。 |
MT 安全(包含异常) |
有关异常的列表,请参见《man pages section 3: Basic Library Functions》中对应页中的 NOTES 部分。 |
异步信号安全 |
可以从信号处理程序中安全地调用此例程。执行异步信号安全例程的线程在被信号中断时,不会自行死锁。 |
Fork1–安全 |
每次调用 Solaris fork1(2) 或 POSIX fork(2) 时,此接口都会释放持有的锁定。 |
有关库例程的安全级别,请参见参考手册页的第 3 部分。
出于以下原因,特意未将某些函数设为安全的。
设置为 MT 安全的接口对单线程应用程序的性能有负面影响。
库具有不安全的接口。例如,函数可能会返回指向栈中缓冲区的指针。可以对其中的某些函数使用可重复执行的对应函数。可重复执行的函数名称是在原始函数名称后附加 "_r"。
确定名称不以 "_r" 结尾的函数是否是 MT 安全的唯一方法就是查看该函数的手册页。必须使用同步设备或通过限制初始线程来保护对标识为非 MT 安全的函数的使用。
对于包含不安全接口的大多数函数而言,存在例程的 MT 安全版本。新的 MT 安全例程的名称始终为原有不安全例程的名称附加 "_r" 后的形式。Solaris 环境中提供表 6–2 "_r" 例程。
表 6–2 可重复执行函数
asctime_r(3c) |
gethostbyname_r(3n) |
getservbyname_r(3n) |
ctermid_r(3s) |
gethostent_r(3n) |
getservbyport_r(3n) |
ctime_r(3c) |
getlogin_r(3c) |
getservent_r(3n) |
fgetgrent_r(3c) |
getnetbyaddr_r(3n) |
getspent_r(3c) |
fgetpwent_r(3c) |
getnetbyname_r(3n) |
getspnam_r(3c) |
fgetspent_r(3c) |
getnetent_r(3n) |
gmtime_r(3c) |
gamma_r(3m) |
getnetgrent_r(3n) |
lgamma_r(3m) |
getauclassent_r(3) |
getprotobyname_r(3n) |
localtime_r(3c) |
getauclassnam_r(3) |
getprotobynumber_r(3n) |
nis_sperror_r(3n) |
getauevent_r(3) |
getprotoent_r(3n) |
rand_r(3c) |
getauevnam_r(3) |
getpwent_r(3c) |
readdir_r(3c) |
getauevnum_r(3) |
getpwnam_r(3c) |
strtok_r(3c) |
getgrent_r(3c) |
getpwuid_r(3c) |
tmpnam_r(3s) |
getgrgid_r(3c) |
getrpcbyname_r(3n) |
ttyname_r(3c) |
getgrnam_r(3c) |
getrpcbynumber_r(3n) |
|
gethostbyaddr_r(3n) |
getrpcent_r(3n) |