std::funture和std::promise

#include <iostream>
#include <thread>
#include <future>void calculateResult(std::promise<int>& promiseObj) {// 模拟耗时计算std::this_thread::sleep_for(std::chrono::seconds(2));// 设置结果到 promise 中promiseObj.set_value(42);
}int main() {// 创建一个 promise 对象std::promise<int> promiseObj;// 获取与 promise 关联的 futurestd::future<int> futureObj = promiseObj.get_future();// 启动一个新的线程执行计算std::thread workerThread(calculateResult, std::ref(promiseObj));// 在主线程中等待任务完成,并获取结果int result = futureObj.get();std::cout << "Result: " << result << std::endl;// 等待工作线程结束workerThread.join();return 0;
}

使用future和promise可以获取到线程执行函数的结果,类似C#实现

#include <iostream>
#include <thread>
#include <future>
#include <vector>
#include <functional>
#include <queue>
class ThreadPool {
public:explicit ThreadPool(size_t numThreads) : stop(false) {for (size_t i = 0; i < numThreads; ++i) {threads.emplace_back([this] {while (true) {std::function<void()> task;{std::unique_lock<std::mutex> lock(mutex);condition.wait(lock, [this] { return stop || !tasks.empty(); });if (stop && tasks.empty()) {return;}task = std::move(tasks.front());tasks.pop();}task();}});}}~ThreadPool() {{std::unique_lock<std::mutex> lock(mutex);stop = true;}condition.notify_all();for (std::thread& thread : threads) {thread.join();}}template <class F, class... Args>auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> {using return_type = typename std::result_of<F(Args...)>::type;auto task = std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));std::future<return_type> result = task->get_future();{std::unique_lock<std::mutex> lock(mutex);if (stop) {throw std::runtime_error("enqueue on stopped ThreadPool");}tasks.emplace([task]() { (*task)(); });}condition.notify_one();return result;}private:std::vector<std::thread> threads;std::queue<std::function<void()>> tasks;std::mutex mutex;std::condition_variable condition;bool stop;
};int calculateResult() {// 模拟耗时计算std::this_thread::sleep_for(std::chrono::seconds(2));return 42;
}int main() {ThreadPool pool(4);std::future<int> futureObj = pool.enqueue(calculateResult);int result = futureObj.get();std::cout << "Result: " << result << std::endl;return 0;
}

在线程池中获取线程执行函数的返回值时,通常使用 std::future 而不是 std::promise 来传递返回值。这是因为线程池内部已经管理了任务的执行和结果的传递,你只需要将任务提交给线程池,并使用 std::future 来获取结果。

线程池内部一般会使用一个任务队列来存储待执行的任务,并使用一个线程池管理器来调度任务的执行。当你向线程池提交任务时,线程池会选择一个空闲的线程来执行任务,并将结果存储在与任务关联的 std::future 对象中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息系统项目管理师——十大管理过程输入、工具和技术、输出(论文篇)二

六、项目风险管理 规划风险管理 在撰写关于“规划风险管理”的论文时&#xff0c;这个过程是项目风险管理的第一步&#xff0c;旨在建立风险管理的框架&#xff0c;为整个项目周期内的风险识别、分析、应对和监控奠定基础。以下是规划风险管理过程中可能涉及的输入、工具和技…

Python学习(五)异常处理

异常概念 异常的捕获方法 try: f open("D:/abc.txt","r",encoding"UTF-8") except: print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开") f open("D:/abc.txt&qu…

Python代码:十、字符串连接

1、题目 小明有两个最好的朋友&#xff0c;他们的名字分别用input读入记录在两个字符串中&#xff0c;请使用字符串连接&#xff08;&#xff09;帮助牛牛将两个朋友的名字依次连接在一个字符串中输出。 2、代码 import sysstr1 input() str2 input() str3 str1 str2 pr…

从0到1:使用HuggingFace的管线加载Diffusion模型生成第一张图像!

Hugging Face系列1&#xff1a;详细剖析Hugging Face网站资源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型简介1.1.2 制作模型卡片1.1.3 模型下载和上传1.1.4 模型应用 1.2 数据集1.2.1 数据集简介1.2.2 调用代码1.2.3 AutoTrain在线微调 1.3 Space应用1.3.1 内容…

理解 Python 中的 `super()` 与 `__init__()` 方法

在 Python 的面向对象编程中&#xff0c;super() 函数和 __init__() 方法是两个非常重要的概念。它们在类的继承和初始化过程中扮演着关键的角色。本文将深入探讨这两个概念的工作原理&#xff0c;并通过示例代码来展示它们的使用。 基本原理 __init__() 方法 __init__() 是…

Vue中的全局事件总线:EventBus与$bus的比较详解与实战应用

EventBus实例&#xff1a; var EventBus new Vue() 会创建一个名为EventBus的Vue实例&#xff0c;并将其存储在变量EventBus中。Vue.prototype.$bus new Vue() 则直接在Vue的原型上创建一个新的Vue实例&#xff0c;并将其赋值给$bus属性。 使用方式&#xff1a; var EventBus…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面&#xff0c;数据验证是一项重要的实现功能&#xff0c;数据验证是指确认 Web 控件输入或选择的数据&#xff…

类对象作为类成员

在C中&#xff0c;类对象可以作为另一个类的成员变量。这种设计方式可以用于创建复杂的对象结构&#xff0c;使得一个类的对象能够包含另一个类的对象。这种嵌套类的组合方式可以增强代码的可重用性和模块化。 类对象作为类成员的示例 让我们通过一个示例来解释这一概念。假设…

武汉信息系统建设和服务能力评估CS认证咨询

很多企业在咨询信息系统建设和服务能力评估的时候喜欢百度搜索&#xff0c;不管是本地咨询机构还是外地咨询机构只要价格便宜就找谁&#xff0c;这个在低等级的CS1是可以这么操作的&#xff0c;一旦上升到CS2级别及以上的&#xff0c;我们一般不推荐找外地咨询机构&#xff0c;…

【文末附gpt升级方案】字节跳动发布豆包大模型:AI领域的革新与引领

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐成为推动社会发展的重要力量。在这一背景下&#xff0c;字节跳动公司以其前瞻性的眼光和创新能力&#xff0c;于XXXX年XX月XX日正式发布了豆包大模型&#xff0c;这一举动无疑在AI领域掀起了新一轮的浪…

C语言.动态内存管理

动态内存管理 1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free 3.calloc和realloc3.1calloc3.2realloc 4.常见的动态内存管理的错误4.1对NULL指针解引用操作4.2对动态开辟空间的越界访问4.3对非动态开辟内存使用free释放4.4使用free释放一块动态开辟内存的一部分4.5对…

军训中的美差

大学时候的军训是在二年级秋季开学前进行的&#xff0c;地点是在河北的某部队。 军训时候的分班是按照学号重新划分的&#xff0c;我的学号在大学宿舍八个人中排最后&#xff0c;恰好就和其他宿舍的人分在了一个班。训练正步走的时候&#xff0c;站在我左边的那个哥们&#xf…

Signal 即将成为JavaScript的一部分

什么是响应性&#xff1f; 在过去的几年中&#xff0c;响应性成为了所有现代前端框架以及React库的核心。 对于不熟悉前端开发的人来说&#xff0c;起初这可能是一个令人困惑的概念&#xff0c;因为它改变了常规的、自上而下的、从调用者到被调用者的顺序工作流。 在响应性范…

AR系列路由器配置VLAN间通信

AR路由器是华为公司推出的企业级路由器产品系列&#xff0c;具有高可靠性、高性能和易管理等特点。AR 系列路由器提供的功能包括路由转发、安全接入、语音、视频、无线等多种业务&#xff0c;支持各种接入方式和协议&#xff0c;并且可以方便地进行扩展和升级。 实验拓扑图&…

微信小程序介绍

一、微信小程序概述 微信小程序是一种不需要下载、安装即可使用的应用&#xff0c;用户只需扫一扫或搜一下即可打开。它实现了应用触手可及的梦想&#xff0c;降低了应用的使用门槛。微信小程序自2017年1月上线以来&#xff0c;已经吸引了大量开发者加入&#xff0c;构建了一个…

【全开源】云界旅游微信小程序(源码搭建/上线/运营/售后/维护更新)

开启您的云端旅行新体验 一、引言 在快节奏的现代生活中&#xff0c;旅行成为了人们放松身心、探索世界的重要方式。让您的旅行更加便捷、高效&#xff0c;打造了云界旅游小程序&#xff0c;带您领略云端旅行的无限魅力。 二、小程序功能概览 云界旅游小程序集成了丰富的旅游…

【代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串】

代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串 一、28. 实现 strStr() 解题代码C&#xff1a; class Solution { public:void getNext(int* next, const string& s) {int j 0;next[0] 0;for(int i 1; i < s.size(); i) {whi…

【Maven】Nexus私服简介_下载安装_登录

1、简介 1.1介绍 Nexus私服&#xff0c;也被称为Maven仓库管理器&#xff0c;是许多公司在自己的局域网内搭建的远程仓库服务器。提供了强大的仓库管理功能和构件搜索功能&#xff0c;使得开发人员能够更方便地管理和使用Maven项目中的依赖库。 1.2作用 内网访问&#xff1…

Python代码:七、小数化整数

1、题目 日常生活中我们会遇到很多小数&#xff0c;但是有的人不喜欢小数&#xff0c;因此会用四舍五入的方式将其去掉。在Python中我们更加简单&#xff0c;可以利用强制类型转换将小数转变成整数&#xff0c;请你试一试。 2、代码 import sysn float(input()) print(int(…

微服务(Spring Clould)--Nacos的安装、配置

简介&#xff1a;&#xff08;取自官网&#xff09; Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了…