scandir真的是线程安全的吗?

5
UNIX® System Threads Reference中,“线程安全”标题下列出了一些函数“不能保证在所有UNIX系统上都是线程安全的”。函数scandir()未出现在此列表中,而readdir()出现在列表中。
但是,针对scandir()的glibc source明显似乎调用的是readdir(),而不是线程安全的readdir_r()。那么,scandir()是否由于其他原因被省略在列表中,或者我错过了某些原因,使其具有线程安全性?

1
“不需要线程安全”的列表的新版本在这里:http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_01,但scandir仍未列出。如果您有时间追踪它们,比较BSD和SysV派生源代码会很有趣。可能应该在glibc上提交错误报告。” - user2404501
1
看起来 glibc 实际上以线程安全的方式实现了 readdir(),因此可能不需要提交错误报告。 - Mike Godin
2个回答

1

我认为,这个列表仅涵盖了POSIX函数。因此,可能没有列出BSD/SVID的scandir(3)函数。新的线程安全函数可能是这个列表的重点,而旧的线程不安全函数则没有列出。


1

看起来 POSIX.1-2008规定scandir()是线程安全的,因为它是POSIX.1-2008函数之一,且不在允许非线程安全的函数列表中。然而,POSIX.1-2008并不排除readdir()是线程安全的可能性,在glibc的情况下,readdir()源代码实际上是线程安全的,因为它不返回全局的struct dirent,而是返回在opendir()调用中返回的DIR类型的glibc定义成员。

所以,即使glibc的scandir()调用readdir(),它仍然似乎是线程安全的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接