下面是C++实现多线程查找文件的完整攻略:
目标
本文要实现一个多线程的文件查找程序,能够快速地在指定目录下查找指定后缀名的文件。
准备工作
首先,在使用多线程之前,需要了解一些基本的多线程知识。
多线程基础知识
- 线程的基本概念
线程是程序执行路径的最小单位,也就是程序执行时线程是调度的基本单位。一个进程中可以包含多个线程,线程共享进程的地址空间和系统资源。
- 线程的创建和加入
线程的创建和加入分别对应线程的启动和停止。创建线程可以使用C++11标准中的std::thread
类,加入线程则是调用线程的join
方法。
- 线程的同步
多线程编程中需要考虑线程安全的问题。线程的同步就是保证多个线程同时访问同一资源时的正确性。C++11中提供了多种同步机制,如互斥锁,条件变量,信号量等。
代码实现
在了解了多线程的基础知识后,我们可以开始实现文件查找程序。
程序的功能和流程如下:
- 用户输入要查找的目录和文件后缀名。
- 创建多个线程并启动,每个线程负责在指定目录下查找符合条件的文件。
- 等待所有子线程结束后,输出所有找到的文件路径。
下面是代码示例一:
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <filesystem>
using namespace std;
using namespace std::filesystem;
mutex mtx; //定义互斥锁
void SearchFiles(const string& strDir, const string& strExt, vector<string>& vecFiles)
{
for (const auto& entry : directory_iterator(strDir))
{
if (is_directory(entry))
{
SearchFiles(entry.path().string(), strExt, vecFiles);
}
else if (entry.path().extension() == strExt)
{
lock_guard<mutex> lock(mtx);
vecFiles.push_back(entry.path().string());
}
}
}
int main()
{
string strDir, strExt;
cout <<"请输入要查找的目录:";
cin >> strDir;
cout <<"请输入要查找的文件后缀名:";
cin >> strExt;
vector<string> vecFiles;
thread threads[4];
for (int i=0; i<4; ++i)
{
threads[i] = thread(SearchFiles, strDir, strExt, ref(vecFiles));
}
for (int i=0; i<4; ++i)
{
threads[i].join();
}
for (auto& filePath : vecFiles)
{
cout << filePath <<endl;
}
return 0;
}
代码说明:
- 首先定义互斥锁,以保证多个线程访问vecFiles时的线程安全性。
- 然后定义SearchFiles函数,根据指定的目录和文件后缀名查找文件,并将查找到的文件路径存放在vecFiles容器中。
- 在主函数中,通过输入获取要查找的目录和文件后缀名,并创建多个线程,每个线程都调用SearchFiles函数进行查找。
- 最后等待所有子线程结束后,输出所有找到的文件路径。
这个程序通过创建多个线程来查找文件,可以提高查找的速度。可以通过调整线程数来进一步优化查找速度。
下面是代码示例二:
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <filesystem>
using namespace std;
using namespace std::filesystem;
mutex mtx;
void SearchFiles(const string& strDir, const string& strExt, vector<string>& vecFiles, int& idx)
{
int i = 0;
for (const auto& entry : directory_iterator(strDir))
{
if (i++ % 4 == idx) //根据idx来决定哪些线程查找当前目录下的文件
{
if (is_directory(entry))
{
SearchFiles(entry.path().string(), strExt, vecFiles, idx);
}
else if (entry.path().extension() == strExt)
{
lock_guard<mutex> lock(mtx);
vecFiles.push_back(entry.path().string());
}
}
}
}
int main()
{
string strDir, strExt;
cout <<"请输入要查找的目录:";
cin >> strDir;
cout <<"请输入要查找的文件后缀名:";
cin >> strExt;
vector<string> vecFiles;
thread threads[4];
for (int i=0; i<4; ++i)
{
threads[i] = thread(SearchFiles, strDir, strExt, ref(vecFiles), ref(i));
}
for (int i=0; i<4; ++i)
{
threads[i].join();
}
for (auto& filePath : vecFiles)
{
cout << filePath <<endl;
}
return 0;
}
代码说明:
- SearchFiles函数中的idx参数用来标识当前线程的编号,通过i%4来决定哪些线程查找当前目录下的文件。
- 在主函数中,线程的创建方式跟示例一类似,但是在调用SearchFiles函数时多传了一个idx参数,以便函数区分出各个线程的任务。
- 最后输出找到的文件路径。
通过这种方式,每个线程只负责查找部分目录下的文件,能够更精细地分配任务,提高查找速度。
总结
本文讲解了如何使用C++实现多线程查找文件的程序,并给出了两个示例来介绍不同的线程分配方式。多线程编程需要掌握多线程的基本知识和线程同步的应用,才能写出高质量的程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现多线程查找文件实例 - Python技术站