我正在尝试使用多线程方法执行递归目录列表。当将异步调用替换为普通单线程递归函数调用时,以下代码可以正常工作,但在使用异步实现时,递归启动的线程似乎在从主完成的初始异步调用完成时终止,因为输出显示多次调用函数但是输出所有文件的唯一目录是最初的目录,“已完成”只输出一次,尽管“已启动”多次输出,并且还输出了其他目录的文件。我怀疑我缺少一些根本性的东西。任何人都可以解释这段代码有什么问题吗?C++异步线程在调用线程完成时终止
#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会抛出一个异常,如果你没有读取权限,将无法继续,所以这种方法应该允许你继续这种情况。
我想知道你为什么要用多线程来做这件事。这有可能会使你的磁盘出现问题。 – paddy
正如你可能猜想的那样,这是一个用于并发编程的学校项目,所以这是使用多线程方法的要点。此外,Visual Studio concurrent_vector和concurrent_queue容器与问题无关。一旦我找出这个问题,他们只能在未来进行进一步的工作并找到文件。 –