在编写目录迭代器时,我发现readdir
函数不是可重入函数。readdir_r
函数似乎是该函数的重入版本,但我不知道如何证实这一点。虽然readdir
被明确标记为不可重入,但没有提到readdir_r
。
有没有办法检查特定POSIX函数的可重入性?如何检查POSIX函数的可重入性?
这里有一个用于重新进入的POSIX.1c策略。
这是我的总结。
- 默认情况下,所有函数都是可重入的
- 由于各种原因,某些功能无法重新进入。他们将有分离的重新进入版本。它们也有明确的标记
- 有些函数对可重入性意味着巨大的性能损失。它们将通过牺牲安全性来分离非重入版本,以实现单线程性能。它们也有明确的标记
这里是另一个警告声明。
引自正文。
线程编程所需的头文件
#define _REENTRANT #include <pthread.h> #include <sched.h>
_REENTRANT表示应该使用标准库的可重入(即线程安全)版本。
头文件pthread.h定义了POSIX线程API。
头文件sched.h定义了进程和线程调度API。在这里解释的功能中,只有
sched_yield()
需要它
无论如何,还有一种说法认为这些步骤不再需要了:是否需要我在编译时添加_REENTRANT宏以确保errno线程的安全 术语可重入性是单线程环境中的遗留术语。无论如何,POSIX.1c假定多线程环境,并且它静默地假定从其他线程情况重新进入。