在 Ubuntu(Linux) 上,readdir 的线程安全性要分情况说,不能简单回答“安全”或“不安全”。
readdir(POSIX 标准,glibc 实现)函数原型:
struct dirent *readdir(DIR *dirp);
readdir 本身不是线程安全的
原因:
readdir 返回的 struct dirent * 是 指向内部静态缓冲区 的指针DIR * 流在多线程中 共享该缓冲区DIR * 调用 readdir,会发生数据竞争// 两个线程同时用同一个 dir 调用 readdir
readdir(dir); // ❌ 不安全
readdirpthread_mutex_lock(&lock);
struct dirent *ent = readdir(dir);
pthread_mutex_unlock(&lock);
适用于:多个线程共享同一个目录流。
DIR *DIR *dir = opendir(path);
不同线程 opendir 不同或各自打开,互不干扰。
readdir_r(已不推荐)int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
⚠️ 注意:
readdir_r 在 glibc 2.34+ 已被废弃readdir + 锁 或 getline/openat 等替代readdir 的“局部安全”说明以下情况是安全的:
DIR *readdirDIR * 且无同步readdiropendirpthread_mutexopenat + getdents64std::filesystemUbuntu 上的
readdir不是线程安全的,但只要不同线程不共享同一个DIR *,或加锁保护,就是安全的。
如果你愿意,我可以:
readdir vs std::filesystem::directory_iterator