如何在C++中实现带有packaged_task的异步等待循环?

How to implement async waiting loop with packaged_task in C++?

本文关键字:task 异步 等待 循环 packaged C++ 实现      更新时间:2023-10-16

假设我们使用packaged_task在程序中实现异步工作。

#include <map>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <future>
#include <thread>
#include <chrono>
int main()
{
std::packaged_task<int()> packagedTaskOne([]()
{
using namespace std::chrono_literals;
std::this_thread::sleep_for(4s);
return 4;
});
std::future<int> futureResultOne = packagedTaskOne.get_future();
std::thread tOne(std::move(packagedTaskOne));
futureResultOne.wait();
tOne.join();
std::cout << "donen";
return 0;
}

我几乎无法想象如何在 C# 中实现waiting cursor,因为我可以使用类似while(!Task.Run(async () => await _service.GetValue()).IsCompleted)的东西并输出一些显示加载的点。我想要packaged_task一样,但我不明白如何将其与while循环融合,因为我没有得到我应该检查这个线程是否完成的条件。如何在C++中使用packaged_task?制作相同的循环

如果您不想使用futureResultOne.get();来避免阻塞,以下是检查您的任务是否已在主线程中完成的方法(当然,您可以使用独立的线程(。

#include <iostream>
#include <future>
#include <thread>
#include <chrono>
#include <condition_variable>
using namespace std::chrono_literals;
std::condition_variable cv;
bool theThreadHasFinished;
std::mutex mut;
int main()
{
std::packaged_task<int()> packagedTaskOne([]{
std::this_thread::sleep_for(4s);
return 4;
});
std::future<int> futureResultOne = packagedTaskOne.get_future();
std::thread tOne([&]{packagedTaskOne();
std::lock_guard lg{mut};
theThreadHasFinished = true;
cv.notify_all();});
tOne.detach();
std::unique_lock<std::mutex> lock{ mut };
cv.wait(lock, [ ](){ return theThreadHasFinished; });
std::cout << "donen";
return 0;
}

您可以使用while循环广告wait_for但这会消耗您的资源