我正在尝试使用多线程方法进行递归目录列表。以下代码在将异步调用替换为普通的单线程递归函数调用时工作正常,但是当使用异步实现时,当从 main 进行的初始异步调用完成时,递归启动的线程似乎都终止了,因为输出显示了对该函数的多次调用开始,但输出所有文件的唯一目录是初始目录,“完成”只输出一次,尽管“开始”输出了几次,并且也输出了一些其他目录的文件。我怀疑我错过了一些基本的东西。谁能解释这段代码有什么问题?
#include <filesystem>
#include <future>
#include <functional>
#include <concurrent_vector.h>
#include <concurrent_queue.h>
#include <iostream>
using namespace std;
using namespace std::tr2::sys;
using namespace concurrency;
concurrent_vector<future<void>> taskList;
void searchFiles(wstring path, concurrent_queue<wstring>& fileList)
{
wcout << L"Started " << path << endl;
wdirectory_iterator directoryIterator(path);
wdirectory_iterator endDirectory;
for( ; directoryIterator != endDirectory; ++directoryIterator)
{
wcout << path + L"/" + (wstring)directoryIterator->path() << endl;
if ( is_directory(directoryIterator->status() ) )
{
taskList.push_back( async( launch::async, searchFiles, path +
L"/" + (wstring)directoryIterator->path(), ref(fileList) ));
}
else
{
fileList.push( path + L"/" + (wstring)directoryIterator->path() );
}
}
wcout << L"Finished " << path << endl;
}
int main()
{
concurrent_queue<wstring> fileList;
wstring path = L"..";
taskList.push_back( async( launch::async, searchFiles, path, ref(fileList) ));
for (auto &x: taskList)
x.wait();
}
顺便说一句,有些人可能会问我为什么不使用 wrecursive_directory_iterator。显然 wrecursive_directory_iterator 将抛出异常并停止,如果您没有读取权限,则无法继续,因此此方法应允许您在这种情况下继续。