我正在编写一个程序,它利用线程池来搜索指定扩展名的文件以匹配正则表达式。线程池的C++ std ::线程停止条件
我的线程池是这样的:
for(int i = 0; i < _nThreads; ++i)
{
_threads.push_back(thread(&ThreadPool::GrepFunc, this));
}
和运行功能如下:
void ThreadPool::GrepFunc()
{
// implement a barrier
while(!_done)
{
while(!_tasks.empty())
{
fs::path task;
bool gotTask = false;
{
lock_guard<mutex> tl(_taskMutex);
if(!_tasks.empty())
{
task = _tasks.front();
_tasks.pop();
gotTask = true;
}
}
if(gotTask)
{
if(std::tr2::sys::is_directory(task))
{
for(fs::directory_iterator dirIter(task), endIter; dirIter != endIter; ++dirIter)
{
if(fs::is_directory(dirIter->path()))
{
{ lock_guard<mutex> tl(_taskMutex);
_tasks.push(dirIter->path()); }
}
else
{
for(auto& e : _args.extensions())
{
if(!dirIter->path().extension().compare(e))
{
SearchFile(dirIter->path());
}
}
}
}
}
else
{
for(auto& e : _args.extensions())
{
if(!task.extension().compare(e))
{
SearchFile(task);
}
}
}
}
}
}
}
本质上的程序接收来自用户的初始目录,将递归通过它可以搜索和所有与扩展匹配的文件的子目录查找正则表达式匹配。我无法确定如何确定何时达到_done的停止情况。我需要确保初始目录中的所有目录和文件都已被扫描,并且在我加入线程之前,_tasks中的所有项目都已完成。任何想法真的会被赞赏。
我知道这是有效的,因为这实际上是我在我的程序的第一个版本中实现的。我只用了一个使用recursive_directory_iterator的单个循环,它执行扫描并将匹配扩展的文件传递给工作线程。然而,通过测试更大的目录,我发现大部分运行时间实际上都花在了递归搜索上,所以我一直在尝试线程化搜索以及线程和优化的练习。如果我找不到解决方案,我会回头看看,但我真的希望找到一种方法来完成这项工作。 – 2012-08-16 03:00:55
那么,我建议单个文件系统搜索线程的原因是多线程你可能会发现你的磁盘头跳来跳去,最终导致性能下降,但这取决于你使用的磁盘技术:严重扫描的磁盘将有更好的并发性,SSD更好地寻求时代。所以是的 - 你可以创建另一个子目录队列来搜索......另一个工作线程池来扫描这些子目录并将子子目录添加到队列中。 – 2012-08-16 03:25:09