在Ubuntu中,使用C++实现多线程读取目录(readdir)可以通过以下步骤完成:
#include <iostream>
#include <dirent.h>
#include <pthread.h>
#include <vector>
struct ThreadData {
std::string path;
};
void* read_directory(void* arg) {
ThreadData* data = static_cast<ThreadData*>(arg);
DIR* dir = opendir(data->path.c_str());
if (dir == nullptr) {
std::cerr << "Error opening directory: " << data->path << std::endl;
return nullptr;
}
struct dirent* entry;
while ((entry = readdir(dir)) != nullptr) {
std::cout << "Thread " << pthread_self() << ": " << entry->d_name << std::endl;
}
closedir(dir);
return nullptr;
}
int main() {
std::string path = "/path/to/directory";
int num_threads = 4;
std::vector<pthread_t> threads(num_threads);
std::vector<ThreadData> thread_data(num_threads);
for (int i = 0; i < num_threads; ++i) {
thread_data[i].path = path;
if (pthread_create(&threads[i], nullptr, read_directory, &thread_data[i]) != 0) {
std::cerr << "Error creating thread "<< i << std::endl;
return 1;
}
}
for (int i = 0; i < num_threads; ++i) {
pthread_join(threads[i], nullptr);
}
return 0;
}
这个示例中,我们创建了4个线程,每个线程都会读取相同的目录。read_directory
函数负责打开目录、读取其中的条目并关闭目录。主函数负责创建线程、传递数据并等待它们完成。
编译并运行此程序,你将看到多个线程同时读取目录的内容。注意,由于多个线程同时访问相同的资源(在这种情况下是目录),可能会出现竞争条件。为了避免这种情况,可以使用互斥锁或其他同步机制来确保线程安全。