11-总结
31.5 总结
若一函数可由多个线程同时安全调用,则称之为线程安全的函数。使用全局或静态变量是导致函数非线程安全的通常原因。在多线程应用中,保障非线程安全函数安全的手段之一是运用互斥锁来防护对该函数的所有调用。这种方法带来了并发性能的下降,因为同一时点只能有一个线程运行该函数。提升并发性能的另一方法是:仅在函数中操作共享变量(临界区)的代码前后加入互斥锁。
使用互斥量可以实现大部分函数的线程安全,不过由于互斥量的加、解锁开销,故而也带来了性能的下降。如能避免使用全局或静态变量,可重入函数则无需使用互斥量即可实现线程安全。
SUSv3所规范的大部分函数都需实现线程安全。SUSv3同时也列出了小部分无需实现线程安全的函数。一般情况下,这些函数将静态存储返回给调用者,或者在对函数的连续调用间进行信息维护。根据定义,这些函数是不可重入的,也不能使用互斥量来确保其线程安全。本章讨论了两种大致相当的编程技术——线程特有数据和线程局部存储——可在无需改变函数接口定义的情况下保障不安全函数的线程安全。这两种技术均允许函数分配持久的、基于线程的存储。
更多信息
请参考29.10节所列的更多信息来源。