1. 按照POSIX 1003.1c 标准编写的程序与Linuxthread 库相连接便可支持Linux平台上的多线程,在程序中需包含头文件pthread. h,在编译连接时使用命令:html
gcc -D -REENTRANT -lpthread xxx. c
其中-REENTRANT宏使得相关库函数(如stdio.h、errno.h中函数) 是可重入的、线程安全的(thread-safe),-lpthread则意味着连接库目录下的libpthread.a或libpthread.so文件。 缓存
在一个多线程程序里,默认状况下,只有一个errno变量供全部的线程共享。在一个线程准备获取刚才的错误代码时,该变量很容易被另外一个线程中的函数调用所改变。相似的问题还存在于fputs之类的函数中,这些函数一般用一个单独的全局性区域来缓存输出数据。安全
为解决这个问题,须要使用可重入的例程。可重入代码能够被屡次调用而仍然工做正常。编写的多线程程序,经过定义宏_REENTRANT来告诉编译器咱们须要可重入功能,这个宏的定义必须出现于程序中的任何#include语句以前。多线程
_REENTRANT为咱们作三件事情,而且作的很是优雅:函数
(1)它会对部分函数从新定义它们的可安全重入的版本,这些函数名字通常不会发生改变,只是会在函数名后面添加_r字符串,如函数名gethostbyname变成gethostbyname_r。.net
(2)stdio.h中原来以宏的形式实现的一些函数将变成可安全重入函数。线程
(3)在error.h中定义的变量error如今将成为一个函数调用,它可以以一种安全的多线程方式来获取真正的errno的值。nuxt
2. 分清 线程安全函数 信号安全函数 可重入函数的 区别。code
文章:htm
http://www.javashuo.com/article/p-opkpwevv-ky.html