// future example
#include <chrono> // std::chrono::milliseconds
#include <cmath>
#include <future> // std::async, std::future
#include <iostream> // std::cout
std::chrono::steady_clock::time_point now() {
return std::chrono::steady_clock::now();
}
long long sub(std::chrono::steady_clock::time_point begin, std::chrono::steady_clock::time_point end) {
return std::chrono::duration_cast<std::chrono::seconds>(end - begin).count();
}
int shared_future() {
std::cout << "--------------- shared_future" << std::endl;
std::future<int> fut = std::async([] { return 10; });
std::shared_future<int> shared_fut = fut.share(); //after fut is not valid
// 共享的 future 对象可以被多次访问.
std::cout << "value: " << shared_fut.get() << '\n';
std::cout << "its double: " << shared_fut.get() * 2 << '\n';
std::cout << "--------------- shared_future" << std::endl;
return 0;
}
int wait() {
// a non-optimized way of checking for prime numbers:
auto is_prime = [](int x) {
for (int i = 2; i < x; ++i) {
if (x % i == 0)
return false;
}
return true;
};
// call function asynchronously:
std::future<bool> fut = std::async(is_prime, 194232491);
std::cout << "Checking...\n";
fut.wait();
std::cout << "\n194232491 ";
if (fut.get()) // guaranteed to be ready (and not block) after wait returns
std::cout << "is prime.\n";
else
std::cout << "is not prime.\n";
return 0;
}
int wait_for() {
std::cout << "--------------- wait_for" << std::endl;
// a non-optimized way of checking for prime numbers:
auto is_prime = [](int x) {
for (int i = 2; i < x; ++i) {
if (x % i == 0)
return false;
}
return true;
};
// call function asynchronously:
std::future<bool> fut = std::async(is_prime, 444444443);
// do something while waiting for function to set future:
std::cout << "checking, please wait";
std::chrono::milliseconds span(100);
while (fut.wait_for(span) == std::future_status::timeout)
std::cout << '.';
bool x = fut.get(); // retrieve return value
std::cout << "\n444444443 " << (x ? "is" : "is not") << " prime.\n";
std::cout << "--------------- wait_for" << std::endl;
return 0;
}
int async() {
std::cout << "--------------- async" << std::endl;
auto ThreadTask = [](int n) {
std::cout << std::this_thread::get_id()
<< " start computing..." << std::endl;
double ret = 0;
for (int i = 0; i <= n; i++) {
ret += std::sin(i); //正弦函數
}
std::cout << std::this_thread::get_id()
<< " finished computing..." << std::endl;
return ret;
};
std::future<double> f(std::async(std::launch::async, ThreadTask, 100000000));
#if 0
while(f.wait_until(std::chrono::system_clock::now() + std::chrono::seconds(1))
!= std::future_status::ready) {
std::cout << "task is running...\n";
}
#else
while (f.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {
std::cout << "task is running...\n";
}
#endif
std::cout << f.get() << std::endl;
std::cout << "--------------- async" << std::endl;
return EXIT_SUCCESS;
}
int deferred() {
std::cout << "--------------- deferred" << std::endl;
auto do_print_ten = [](char c, int ms) {
for (int i = 0; i < 10; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
std::cout << c;
}
};
std::cout
<< "with launch::async:\n";
std::future<void> foo =
std::async(std::launch::async, do_print_ten, '*', 100);
std::future<void> bar =
std::async(std::launch::async, do_print_ten, '@', 200);
// async "get" (wait for foo and bar to be ready):
foo.get();
bar.get();
std::cout << "\n\n";
std::cout << "with launch::deferred:\n";
foo = std::async(std::launch::deferred, do_print_ten, '*', 100);
bar = std::async(std::launch::deferred, do_print_ten, '@', 200);
// deferred "get" (perform the actual calls):
foo.get();
bar.get();
std::cout << '\n';
std::cout << "--------------- deferred" << std::endl;
return 0;
}
int asyncTime() {
auto sleep = [](int s) { std::this_thread::sleep_for(std::chrono::seconds(s)); };
auto start = now();
std::async(std::launch::async, sleep, 2); // 临时对象被析构,阻塞 2s
std::cout << "cost:" << sub(start, now()) << std::endl; //cost 2s
start = now();
std::async(std::launch::async, sleep, 2); // 临时对象被析构,阻塞 2s
std::cout << "cost:" << sub(start, now()) << std::endl; //cost 2s
start = now();
auto f1 = std::async(std::launch::async, sleep, 2);
std::cout << "cost:" << sub(start, now()) << std::endl; //cost 0s
start = now();
auto f2 = std::async(std::launch::async, sleep, 2);
std::cout << "cost:" << sub(start, now()) << std::endl; //cost 0s
f2.get();
std::cout << "cost:" << sub(start, now()) << std::endl; //cost 2s
return 0;
}
int main() {
shared_future();
wait_for();
wait();
async();
deferred();
auto start = now();
asyncTime();
std::cout << "main::cost:" << sub(start, now()) << std::endl; //cost 6s
return 0;
}
相关推荐
GPU计算板卡设计原理图:735-基于3U VPX的AGX Xavier GPU计算主板
基于3U VPX的 Jetson AGX Xavier GPU计算主板是LINUX环境下软件开发等理想工具。是用于视频处理,相机信号,支持PCIE、USB、RS422、RS232、网口、SPI、I2C等综合性的信号计算主板。3. 支持外接HDMI连接显示器,并支持键盘,鼠标等外接设备进行调试。8 核 ARM v8.2 64 位 CPU、8 MB L2 + 4 MB L3。4路Gigabit Ethernet (10/100/100)link。1路RS232,1路RS485。1路 NVMe PCIeX4。
Java并发编程:Callable、Future和FutureTask原理解析
返回结果的任务Callable与FutureExecutor框架使用Runnable作为其基本的任务表示形式。Runnable是一种有很大局限的抽象,它不能返回一个值或抛出一个受检查的异常。Runnable接口:public interface Runnable { public abstract void run(); }由于run()方法返回值为void类型,所以在执行完任务之后无法返回
加湿器方案-DLT8M04TS-杰力科创
基本组成: 一个触摸按键、一组RGB灯、一个雾化片、一个充电IC。 产品功能: 第一次上电光机状态,RGB红/绿/红灯依次闪烁灭; 2、按键功能:短按开关机和三档喷雾工作模式,第一次短按持续喷雾,短按第二次喷3S,停3S,短按第三次关闭喷雾模式,依次循环; 在喷雾或是不喷雾的状态下长按1.5S RGB灯渐变,一直循环,第二次长按当前灯光闪烁一下常亮,第三次长按关机; 3、持续喷雾定时5小时自动断电,间歇喷雾定时10小时自动断电,若在间歇工作时有切换为持续喷雾,那间歇喷雾的...
in future 和 in the future用法的区别
in future 和当前的事情有关系,比如说今天迟到了,老师警告说今后要按时到学校哦,就用in future。in the future 只是一种抽象的概念,词组有in the near/distant future, 不久/很久以后。牛津例句1. Please be punctual in future. 今后请准时。2. Who knows what will happen in the f...
LLM and Embedding区别
LLM(大语言模型)和 Embedding(嵌入)是自然语言处理(NLP)中的两个核心概念,它们的核心区别在于。Embedding 计算向量。
多核系统核间通信(IPC)设计:从硬件机制到软件实现
在多核处理器与嵌入式系统设计中,核间通信(IPC)是实现计算资源协同工作的核心技术。其原理基于共享内存、硬件邮箱与中断等底层硬件机制,通过构建结构化的消息传递通道,实现核间高效、可靠的数据交换。该技术的核心价值在于打破多核间的壁垒,将分散的计算单元整合为有机整体,从而显著提升系统整体性能与响应能力。在工程实践中,IPC广泛应用于智能座舱、边缘AI网关、实时控制系统等场景,用于处理如仪表显示、AI推理、实时控制等复杂任务。本文聚焦于基于共享内存与VRING的消息队列实现,深入剖析缓存一致性、内存屏障等关键问题
Future和FutureTask的区别
java中有Future和FutureTask这两个类Future是一个接口,代表可以取消的任务,并可以获得任务的执行结果FutureTask 是基本的实现了Future和runnable接口 实现runnable接口,说明可以把FutureTask实例传入到Thread中,在一个新的线程中执行。 实现Future接口,说明可以从FutureTask中通过g...
VLA数据采集以及训练
直到15s计时结束,弹出下面的内容,这个时候不会录制视频了,这里就是需要复位物体到初始位置,尽量保证物体的初始位置放在一样的位置,计时3s,同样根据自己的复位时间来修改(--dataset.reset_time_s=3),这里和前面录制数据的区别就是fps后面多了一个nment,可以作为一个标记,知道什么时候开始去复位而不会拍到自己的手臂。复制网址,在浏览器打开,会出现下面的窗口,依次检查每一轮是否存在问题,例如是否出现录制不完整,是否存在除了机械臂以外的其他移动物体,这些都可能会影响最终训练的效果。
对多线程future以及futureTask的理解
异步计算助手FutureTask 由来原因: 无论是Runnable实例还是Callable实例所表示的任务,只要我们把这些任务扔到线程池中,那么这些任务就是异步任务。 1.采用Runnbale实例来表示异步任务,其优点:任务既可以以相应的Runnable实例为参数创建并启动一个工作线程,也可以交给一个线程池或者Executor的其他实例类来执行;其缺点:我们无法直接获取任务的执行结果。 2...
Parasoft C++Test软件集成测试(部件测试)_实例讲解
本文以一组功能函数组件作为示例,讲解了如何使用C++Test进行软件集成测试。本文的示例比较简单,但是思路、方法和流程都是通用的,希望对大家有所帮助。
windows搭建IIS(FTP)
适用于参加网络系统管理的学生进行学习与参考
多线程编程七-Furture模式
Furture模式是把一个任务拆成多个子任务,没有依赖关系的子任务来并行执运行的模式,旨在提高程序处理效率 假如说做饭需要三步,买菜(2秒)、买油(3秒)、炒菜(4秒)三步,其中买菜、买油可以两个人同时做,炒菜依赖买菜、买油的结果。 private String buyVegetable() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace();...
用 ABAP EML 驾驭 RAP 业务对象:从事务缓冲区到落库提交的一条龙实践
摘要:ABAP EML(Entity Manipulation Language)是SAP RAP框架的核心语言能力,为ABAP开发者提供强类型、批处理友好的方式操作RAP业务对象。EML通过事务缓冲区管理数据变更,支持读取(READ ENTITIES)、修改(MODIFY ENTITIES)及事务控制(COMMIT/ROLLBACK ENTITIES)。其特点包括:基于BDEF派生类型确保类型安全,%control和%cid等特殊字段实现精细控制,统一的消息模型便于错误处理。相比传统ABAP数据访问方式,
设计模式-Future
Future设计模式学习记录备忘 Future模式设计图 图片摘自(https://www.cnblogs.com/jianzh5/p/6121120.html) 简单实现代码 Data接口 package org.cc.future; public interface Data { public String getResult(); } ...
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
J.U.C系列(四)FutrueTask的使用
FutureTask FutureTask实现了RunnableFuture接口,RunnableFuture接口继承于Runnable, Future<V> 这使得FutureTask既可以当做一个任务执行,也可以有 返回值。 public class FutureTask<V> implements RunnableFuture<V> public interface RunnableFuture<V> extends Runnable, Future&
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
Callable与Future
Callable与Future 使用线程池来创建并行的任务: 这个一个简单的demo,可以在最后统一获取执行结果;以此类推ExecutorService threadPool = Executors.newFixedThreadPool(2); Future<Integer> future = threadPool.submit(new Callable<Integer>() {
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
C++11,thread,sleep,锁
相关链接:https://blog.youkuaiyun.com/knowledgebao/article/details/85076661 sleep: #include <thread> #include <iostream> auto start = std::chrono::high_resolution_clock::now(); std::this_thread::...
stdout stderr 重定向到文件
stdout/stderr 重定向到新文件,重定向到已经打开的文件,命令行的重定向
C/C++调用第三方程序
相关链接:https://blog.youkuaiyun.com/knowledgebao/article/details/85076661 目录 linux下: 1,exec() 2,spawn() 3,stem() window下: 1,WinExec()函数 2,ShellExecute()函数 3,CreateProcess函数 4,CreateProcessAsUser lin...
c/c++/c++11/c++14 static const constexpr区别
c/c++/c++11/c++14 static const constexpr区别
C语言-含有指针的结构体浅拷贝注意事项
相关链接:https://blog.youkuaiyun.com/knowledgebao/article/details/85076661 浅拷贝指针覆盖问题。 下边代码包含: 1,结构体CHSYS_AV_DecParam 2,CHSYS_AV_DecParam的变量m_paramDec 3,函数Create 有两点需要注意: 第一:判断if (pParam != &m_paramDe...
GCC编译/连接/优化等选项
GCC 编译流程分为四个阶段:预处理、编译、汇编、链接,这里讲解gcc用到的一些参数-o(输出文件名)-lm(链接数学库 libm)-Wall(启用警告)-O2(优化级别)–gc-sections(移除未使用的节)-soname(设置共享库运行时名称)-T(使用自定义链接脚本)
strncpy 和 snprintf 的区别
strncpy 和 snprintf 的区别尾部是否添加 '\0' 字符问题
C++time相关
using TIME_POINT = std::chrono::steady_clock::time_point; TIME_POINT getCurrentTimePoint(){ return std::chrono::steady_clock::now(); } int64_t getDeltaS(TIME_POINT beg){ return getDeltaS(beg, getCurrentTimePoint()); } int64_t getDeltaS(TIME_POIN
std::future
1. future 1. future 1.1. future相关结构 1.2. async相关结构 1.3. packaged_task 相关结构 1.4. promise相关结构 1.5. 参考资料 1.1. future相关结构 Member functions fun desc pub/priv (constructor) constructs the future object (public member function) (destructor) destruc
promise-demo
#include <chrono> // std::chrono::seconds #include <exception> // std::exception, std::current_exception #include <functional> // std::ref #include <future> // std::promise, std::future #include <iostream> // std::c
980



被折叠的 条评论
为什么被折叠?



