在 CentOS(Linux) 上,如果你说的 readdir 是指 遍历目录(readdir / readdir_r / getdents),想并发地读取多个目录或并发处理目录项,可以从下面几个层面来做:
readdir() / readdir_r() 不是线程安全的(readdir 本身有内部状态)#include <dirent.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
void* scan_dir(void* arg) {
char* path = arg;
DIR* dir = opendir(path);
if (!dir) return NULL;
struct dirent* entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] == '.') continue;
printf("%s/%s\n", path, entry->d_name);
}
closedir(dir);
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_create(&t1, NULL, scan_dir, "/var/log");
pthread_create(&t2, NULL, scan_dir, "/tmp");
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
✅ 安全、简单、高效
适合:
readdird_name 扔进队列readdir → queue → worker threads
while ((e = readdir(dir))) {
push_queue(e->d_name);
}
/
├── a/ → thread1
├── b/ → thread2
├── c/ → thread3
⚠️ 注意:
pthread_pool 或 libuv / libeventreaddir 底层是 getdents64
#include <sys/syscall.h>
#include <unistd.h>
✅ 性能更好
❌ 可移植性差
✅ 仍 不能并发读同一目录
find /path -type f | xargs -P 8 -I{} process {}
| 场景 | 推荐方案 |
|---|---|
| 多目录 | 多线程各自 readdir |
| 单目录很多文件 | 单线程 readdir + 线程池 |
| 目录树 | 递归 + 线程池 |
| 极致性能 | io_uring |
如果你愿意,可以告诉我:
我可以直接给你一份可编译的并发 readdir 示例。