我正在編寫一個程序,它利用線程池來搜索指定擴展名的文件以匹配正則表達式。線程池的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