マルチスレッドのアプローチを使用して、再帰的なディレクトリ リストを作成しようとしています。次のコードは、非同期呼び出しを通常のシングル スレッドの再帰関数呼び出しに置き換えると正常に動作しますが、非同期で実装すると、再帰的に開始されたスレッドはすべて、main から行われた最初の非同期呼び出しが終了したときに終了するように見えます。ただし、すべてのファイルが出力されるディレクトリは最初のディレクトリのみであり、「開始」は数回出力され、他のディレクトリのファイルも出力されますが、「終了」は 1 回だけ出力されます。私は根本的な何かが欠けていると思います。このコードの何が問題なのか説明できる人はいますか?
#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 は例外をスローし、読み取り権限がない場合は続行できずに停止するため、このメソッドを使用すると、その場合に続行できるはずです。