使异步任务休眠
Sleep an Async Task
在我的项目中,我需要每n秒轮询一些设备,然后休眠并永远继续。我创建了一个异步任务,以异步而不是std::thread
启动。但是,如果我在异步任务中使用std::this_thread::sleep_for()
并异步启动,看起来它实际上阻止了我的主线程? 以下程序永远输出"Inside Async..",它永远不会打印"Main function"。
而不是异步,如果我使用std::thread()
,它会正常工作。但是我想使用异步任务,因为我不必像线程那样加入它并管理其生存期。
如何使异步任务进入睡眠状态?
#include <iostream>
#include <future>
#include <thread>
int main()
{
std::async(std::launch::async,
[]()
{
while(true)
{
std::cout <<"Inside async.."<< std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
}
});
std::cout <<"Main function"<< std::endl;
return 0;
}
std::async
返回一个std::future
,该等待任务在其析构函数中完成。将std::future
保存在某个位置以延迟析构函数:
auto future = std::async(...)
.
std::async
返回一个立即被销毁的std::future
(它是一个临时的,不会因常量引用而延长或移动到某个对象中(。
std::future
块的析构函数,直到std::future
呈现的异步结果完成。 由于异步任务尚未完成,因此对std::async
的调用将永远停止。
延长未来的生存期将无济于事,因为它的析构函数会在某个时候阻塞,您的异步任务永远不会结束。 在这里使用std::thread
似乎是合适的。
事实上,我建议你使用一些第三点计时器实现,因为你想要的是一个定期执行的异步任务。 这对于计时器来说是完美的。
相关文章:
- 有没有任务栏API可以立即应用注册表更改
- 如何创建线程序列以按照启动顺序执行任务?
- C++一个线程如何正确通信其任务已完成?
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- C++ 任务流库入门
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 编写一个读取五个整数并执行一些任务的C++程序
- 任务内部的 OpenMP 任务循环
- 工作线程在执行太快后永久休眠
- 不知道如何在家庭作业任务中实现一件事
- 如何安全地停止 IOCP WSARecv() 任务,并释放 WSAOVERLAPED 结构?
- 为什么我的 FreeRTOS 任务看不到类成员?
- 当前步骤:构建任务.json 文件
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 命令模式 - 使用"weight"执行任务的命令
- 无法删除EXE崩溃后,即使进程未显示在任务管理器中
- 使异步任务休眠