我正在嘗試使用多線程方法執行遞歸目錄列表。當將異步調用替換爲普通單線程遞歸函數調用時,以下代碼可以正常工作,但在使用異步實現時,遞歸啓動的線程似乎在從主完成的初始異步調用完成時終止,因爲輸出顯示多次調用函數但是輸出所有文件的唯一目錄是最初的目錄,「已完成」只輸出一次,儘管「已啓動」多次輸出,並且還輸出了其他目錄的文件。我懷疑我缺少一些根本性的東西。任何人都可以解釋這段代碼有什麼問題嗎?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容器與問題無關。一旦我找出這個問題,他們只能在未來進行進一步的工作並找到文件。 –