linux

Linux readdir如何实现多线程读取

小樊
44
2025-04-26 15:02:57
栏目: 智能运维

在Linux中,使用readdir函数可以读取目录中的文件和子目录。要实现多线程读取,可以将目录分割成多个部分,然后为每个部分创建一个线程来执行readdir操作。下面是一个简单的示例,使用C++11线程库实现多线程读取目录:

#include <iostream>
#include <dirent.h>
#include <vector>
#include <thread>
#include <mutex>

std::mutex mtx;

void read_directory(const std::string &path, int start, int end) {
    DIR *dir = opendir(path.c_str());
    if (!dir) {
        std::cerr << "Error opening directory: " << path << std::endl;
        return;
    }

    struct dirent *entry;
    int count = 0;
    while ((entry = readdir(dir)) != nullptr) {
        if (count >= start && count < end) {
            std::lock_guard<std::mutex> lock(mtx);
            std::cout << entry->d_name << std::endl;
        }
        count++;
    }

    closedir(dir);
}

int main() {
    std::string path = "/path/to/your/directory";
    DIR *dir = opendir(path.c_str());
    if (!dir) {
        std::cerr << "Error opening directory: " << path << std::endl;
        return 1;
    }

    struct dirent *entry;
    int file_count = 0;
    while ((entry = readdir(dir)) != nullptr) {
        file_count++;
    }
    closedir(dir);

    int num_threads = 4;
    std::vector<std::thread> threads;
    int files_per_thread = file_count / num_threads;

    for (int i = 0; i < num_threads; ++i) {
        int start = i * files_per_thread;
        int end = (i == num_threads - 1) ? file_count : (start + files_per_thread);
        threads.push_back(std::thread(read_directory, path, start, end));
    }

    for (auto &t : threads) {
        t.join();
    }

    return 0;
}

这个示例中,我们首先计算目录中的文件数量,然后将文件平均分配给每个线程。每个线程读取分配给它的文件,并将文件名输出到控制台。注意,这个示例没有处理目录中的...条目,你可能需要根据实际需求进行调整。

编译并运行此程序,它将使用多个线程读取指定目录中的文件。请确保在编译时链接C++11线程库,例如使用g++ -std=c++11 -pthread your_program.cpp -o your_program

0
看了该问题的人还看了