多线程编程指南

MT 接口安全级别

线程手册页 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 部分。

出于以下原因,特意未将某些函数设为安全的。


注意 – 注意 –

确定名称不以 "_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)