c++ - 如何在 C++ 中使用 packaged_task 实现异步等待循环?
问题描述
让我们说,我们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 << "done\n";
return 0;
}
我几乎无法想象如何waiting cursor
在 C# 中实现,因为我可以使用类似的东西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 << "done\n";
return 0;
}
您可以使用while
循环广告wait_for
,但这会消耗您的资源
推荐阅读
- javascript - Clicking a button to show a modal makes button appear "on top" of modal
- java - Java Runtime.exe() not returning PowerShell command output
- android - FragmentManager 移除
- wordpress - 仅使用 AMP 单个帖子 wordpress
- android - MvvmCross 和 Xamarin.Forms - Android 参考不包括 MvvmCross.Forms.Platforms.Android.Views
- python - Summing over all but one axis
- python - 如何用标记“o”绘制一个点并通过半径指定大小?
- postgresql - 带有 PostgreSQL 后端的数据库秘密引擎的 Vault PostgreSQL 插件如何工作?
- kubernetes - Gitlab Runner 无法访问 Gitlab 自托管实例
- jquery - jquery increase number if next prev is clicked