从 std::function 到 Future:一篇讲透 C++ / Java / Kotlin 的统一并发模型

张开发
2026/6/1 16:38:28 15 分钟阅读
从 std::function 到 Future:一篇讲透 C++ / Java / Kotlin 的统一并发模型
一、从一个问题开始最近在写 C 线程池时看到这样一行代码std::queuestd::functionvoid() tasks_;脑子里冒出三个问题这是不是 Kotlin 的高阶函数能不能当回调函数用里面各种到底是什么意思 本文解决三个核心问题函数、回调、任务、Future本质到底是不是一套东西二、一图讲透三端统一模型核心认知函数任务 → 调度线程池 → 结果Future对应三端层级CJavaKotlin任务std::functionRunnable / Callablelambda调度queue threadExecutorDispatcher结果futureFutureDeferred本质结论三门语言只是语法不同本质是同一套并发模型三、第一层函数 可传递的“行为”高阶函数本质Kotlin最直观fun request(callback: (String) - Unit) { val result success callback(result) }C 完全等价void request(const std::functionvoid(const std::string) callback) { std::string result success; callback(result); }Javavoid request(ConsumerString callback) { callback.accept(success); }✅ 核心认知函数 可以被传递、存储、延迟执行的行为四、回调函数本质典型回调流程传入函数 → 内部执行 → 调用函数 → 返回结果Kotlinrequest { println(结果: $it) }Crequest([](const std::string value) { std::cout 结果: value std::endl; });本质回调 “执行完之后再调用的函数”五、任务模型 vs 回调模型关键区别1️⃣ 回调模型有参数std::functionvoid(int) 调用时传参数2️⃣ 任务模型无参数std::functionvoid() 参数通过“闭包捕获”示例int result 42; tasks_.push([result] { std::cout result std::endl; });关键理解回调 参数在调用时传任务 参数在创建时绑定闭包六、闭包Closure本质必须吃透什么是闭包函数 它捕获的外部变量Cint x 10; auto f [x]() { std::cout x; };Kotlinval x 10 val f { println(x) }本质函数不仅是代码还携带上下文七、彻底讲清楚C 里的各种重点1️⃣ 参数引用避免拷贝void func(const std::string s) 不复制字符串提高性能2️⃣ 对象引用callbackconst std::function... callback 不拷贝函数对象3️⃣ lambda 捕获[x] // 值捕获[x] // 引用捕获对比总结写法含义T引用变量const T只读引用推荐[x]拷贝变量[x]引用外部变量一句话记忆函数参数里的 不拷贝数据callback 后的 不拷贝对象lambda 里的 是否共享外部变量八、线程池核心queuefunction 到底是什么std::queuestd::functionvoid() tasks_;本质任务缓冲队列调度系统核心执行流程提交任务 → tasks_ → worker线程 → 执行关键理解线程池不是线程集合而是“任务调度系统”九、Future 到底多了什么核心区别function “要做什么”Future “做完了吗 结果是什么”对比能力functionFuture表示任务✅❌有返回值❌✅可等待❌✅有状态❌✅十、execute vs submit架构升级execute提交 → 执行 → 结束 类似 MQ不关心结果submit提交 → 执行 → 返回结果 → get() 类似 RPC请求-响应C 实现 submittemplatetypename F auto submit(F f) { std::packaged_task task(f); auto future task.get_future(); tasks_.push([t std::move(task)]() mutable { t(); }); return future; }十一、终极统一模型你现在的认知高度函数行为 队列调度 Future结果十二、一句话记忆回调是函数任务也是函数有参回调 调用时传值无参任务 闭包带值function 做什么Future 做完了吗线程池 谁来做写在最后当你把这套模型打通之后C lambda ✔Java 线程池 ✔Kotlin 协程 ✔ 你会发现它们不是三套技术而是一套思想的三种实现

更多文章