在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
函數負責打開目錄、讀取其中的條目并關閉目錄。主函數負責創建線程、傳遞數據并等待它們完成。
編譯并運行此程序,你將看到多個線程同時讀取目錄的內容。注意,由于多個線程同時訪問相同的資源(在這種情況下是目錄),可能會出現競爭條件。為了避免這種情況,可以使用互斥鎖或其他同步機制來確保線程安全。