也许你很奇怪,为什么标题后面有个(二)。因为在信号的章节中,已经使用过此标题了。那为什么这一次又再讲一遍?这是因为,在异步信号处理与多线程中,可重入有一点点区别。
1. 可重入函数
到了这里,我们将可重入函数分成两类:
- 对线程可重入
- 对信号可重入
注意,上面两种是不同的。对于信号可重入,我们已经学习过了。
1.1 对线程可重入
如果一个函数对线程重入是安全的,则称其为线程安全函数。它的意思是说,在相同的时间点,可以被多个线程安全地调用。这种函数的特征:
- 不包含全局变量或静态变量
- 如果包含全局变量或静态变量,需要加互斥锁
这些内容,其实我们在前面都已经做过实验,讨论过了。
1.2 对信号可重入
如果一个函数对异步信号处理程序的重入是安全的,则称其为异步信号安全函数。它的意思是说,在相同时间点,可以在执行信号处理函数的时候,可被新的信号打断,再次进入信号处理函数。
这一种,就是在信号章节中所讲的可重入函数,当时规定,它里面不能有全局的或者是静态变量。即它具备下面的特征:
- 不包含全局变量或静态变量
对比线程安全函数,我们可以看到异步信号安全函数多了一条规则,就是不允许出现互斥锁。如果你完成了《递归型互斥量》一文中的实验,相信不难理解,为什么信号处理函数中,不推荐使用互斥量(容易死锁),如果真的要用,只能使用递归类型的互斥量。
2. 总结
- 线程安全函数不一定是异步信号安全的