首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++11异步编程(std::async, std::future, std::packaged_task, std::promise)

async比起thread来说可以对线程创建又有了更好控制,比如可以延迟创建。下面先介绍一下std::future, std::packaged_task, std::promise。... std::promise是一个类模板,它作用是在不同线程中实现数据同步,与future结合使用,也间接实现了future在不同线程间同步。...main() { std::promise p; std::future fu = p.get_future(); // 并将结果返回给future std::...需要注意是在使用过程中不能多次set_value(),也不能多次get_future()多次get(),因为一个promise对象只能一个对象相关联,否则就会抛出异常。...std::async        其实这个函数是对上面的对象一个整合,async先将可调用对象封装起来,然后将其运行结果返回到promise中,这个过程就是一个面向future一个过程,最终通过future.get

14.9K30
您找到你想要的搜索结果了吗?
是的
没有找到

【Example】C++ 标准库多线程同步及数据共享 (std::futurestd::promise)

【语法】【伪代码】std::future name(promise.get_future()); 【负责存储】std::promise 也是一个模板类,它提供了存储异步执行异常一种方式...名称 值 示意 broken_promise 0 与其关联 std::promise 生命周期提前结束。 future_already_retrieved 1 重复调用 get() 函数。...4,std::promise 在作为使用者异步线程当中,应当注意共享变量生命周期、是否被 set 问题。如果没有共享值没有被 set,而异步线程却结束,future 端会抛出异常。...std::shared_future 与 std::packaged_task std::future 有个非常明显问题,就是只能一个 std::promise 成对绑定使用,也就意味着仅限于两个线程之间使用...5,std::packaged_task 应谨慎操作,它本身生命周期应持续到所有与它关联 future 结束后为止。

1.3K30

std future get_waitkey(0)

大家好,又见面了,我是你们朋友全栈君 一、关于std::future成员函数wait_for(): 1.1 关于std::future_status: std::future_status是一个枚举类型...此时线程不在阻塞在wait_for()处,而是继续执行直到遇见属于该future对象get(): else if (status==std::future_status::deferred) {...在实际开发中,有时候某线程值不止被一个线程所需要,而get()却只能只用一次,这时可以通过std::shared_future达到多次通过get()获取值目的: std::futuremyf...也可不通过std::future连接std::shared_futurepackaged_task对象: //原: std::futuremyf = mypt.get_future(); std...其实std::atomic是用来封装某个类型 原子操作: 在多线程中不会被打断程序执行片段。 效率上: 原子操作要比互斥量方式效率要高。

35830

std::atomicstd::mutex区别

std::atomic介绍​ ​模板类std::atomic是C++11提供原子操作类型,头文件 #include。​...在多线程调用下,利用std::atomic可实现数据结构无锁设计。​​ ​互斥量不同之处在于,std::atomic原子操作,主要是保护一个变量,互斥量保护范围更大,可以一段代码或一个变量。...原子类型内置类型对照表如下:​​ 原子类型.png 以下以两个简单例子,比较std::mutexstd::atomic执行效率 atomicmutex性能比较 使用std::mutex #include... std::atomic cnt(0); void mythread() { for (int i = 0; i < 1000000; i++) { cnt...,使用std::atomic,耗时比std::mutex低非常多,​使用 std::atomic ​​能大大提高程序运行效率。​​

2.4K00

深入理解 C++ 中 std::cref、std::ref std::reference_wrapper

深入理解 C++ 中 std::cref、std::ref std::reference_wrapper 在 C++ 编程中,有时候我们需要在不进行拷贝情况下传递引用,或者在需要引用地方使用常量对象...为了解决这些问题,C++ 标准库提供了三个有用工具:std::cref、std::ref std::reference_wrapper。这篇文章将深入探讨这些工具用途、区别以及实际应用。...1. std::cref:创建常量引用 std::cref 是一个模板函数,用于创建对常量对象引用。它返回一个 std::reference_wrapper 对象,可以在需要引用地方使用。...它返回一个 std::reference_wrapper 对象,允许我们在需要引用地方使用,同时允许修改被引用对象。...允许我们将引用包装在容器中,然后通过 get() 方法来访问修改原始对象值。

69910

CC++开发基础——std::future与async异步编程

一,std::futurestd::promise std::future是一个类模板,存放了线程入口函数返回结果,调用std::future对象get()函数可以拿到返回结果。...std::promise也是一个类模板,可以基于std::promise实现线程之间数据传输。 构造一个std::promise对象时,可以std::future对象相互关联。...} } 运行结果: Caught exception: Exception throw from CalculateSum. 2.std::promisestd::future区别 同一个线程或者另一个线程将线程函数计算结果放入到...std::promise中,而std::future可以获取std::promise中存储线程计算结果。...std::shared_future成员函数用法std::future基本一致,主要区别在于,std::shared_futureget()函数是用来复制数据,而不是移动数据,这样设计可以让多个线程都可以通过

36710

QStringStd::String

前言 最近踩坑发现QString实现std::string实现机制略有不同,了解其内存模型对于使用QStringstd::string后续bugfix都有很大帮助,现记录分享如下。...在执行字符串操作时,std::string会尽量避免不必要内存分配复制,从而提高性能。 总之,std::string内存模型主要基于动态内存分配、内存分配策略、字符编码字符串操作等方面。...这些设计使得std::string在处理字符串时具有高效、可扩展性能。在使用std::string时,请确保遵循C++标准库最佳实践建议,以充分利用其内存模型性能优势。...当多个线程同时访问修改共享std::string对象时,COW策略可能导致未定义行为。...这有助于确保std::string在多线程环境下线程安全,提高性能可移植性。在使用std::string时,请确保遵循C++标准库最佳实践建议,以充分利用其内存模型性能优势。

16410

如何优雅使用 std::variant 与 std::optional

either monad, 以标准库方式加入这些概念, 明显会强化更好约束我们对相关概念表达....optionalvariant都是类型(sum type, 表达是值个数是所有type总和), 区别于struct所表达积类型....需要注意是区别于前面的单参数operator()操作符, ponder中LessThanVisitorEqualVisitor都是双参数, 这个其实使用也比较简单: std::variant<int...答案是显然, cppreference上std::visit示例代码参考链接中第二篇就介绍了这种方法, 并与rustenum做了简单对比, 通过引入两行代码, 即能优雅实现对std::variant...方式完成对std::variant访问, 以及相关ponde使用示例代码, 介绍了一个利用c++17特性实现overloaded特性.

2.9K10

std::概念与作用

std:: 当中std是名称空间,防止反复。比如说很多人给函数取名可能都叫f1();你使用时候就可能造成问题。如果各人均把自己f1()放进自己名称空间。...我们在使用时候带上名称空间就不会有问题。 主要是起到了资源管理作用。以下是一个样例: 有两个软件公司A公司B公司,他们都是用C++语言开发他们产品。...那么,他们分别编写了a.hb.h两个自己头文件,这两个文件中都有一个叫func()函数。 他们各自使用也没什么问题。 如果你公司也是一个软件公司,你如今要开发一个软件。...必须同一时候用到A公司B公司头文件,同一时候会调用他们func()函数。这个时候问题就来了,你调用func()函数,编译器不知道应该选用A公司还是B公司。 为解决问题。...(C)这个不包括声明std代码却尝试打开std包, 落了个跟(A)一样狼狈下场: using namespace std; void main( ) { std::cout

49420

高效使用stl::mapstd::set

1、低效率用法 // 先查找是否存在,如果不存在,则插入 if (map.find(X) == map::end()) // 需要find一次 {     map.insert(x); // 需要find...if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 } else {     // 不存在时处理 } 2、高效率用法...// 解决办法,充分利用inserterase返回值,将find次数降为1 map::size_type num_erased = map.erase(X); // 需要find一次 if (0...== num_erased) {     // 不存在时处理 } else {     // 存在且删除后处理 } pair result_inserted; result_inserted = map.insert...(X); if (result_inserted.second) {     // 不存在,插入成功后处理 } else {     // 已经存在,插入失败后处理     result_inserted.first

2.9K20

链表C++ std::list详解

链表std::list 链表是一种在物理上非连续、非顺序数据结构,数据元素逻辑顺序是通过链表中指针链接实现,其由若干节点所组成。...std::list是C++中支持常数时间从容器任何位置插入移除元素容器,但其不支持快速随机访问,其通常实现为双向链表。...2.2.3 迭代器 begin、endcbegin、cend 功能描述 begincbegin返回指向list首元素迭代器, endcend返回指向list末元素后一元素迭代器。...3-6中按照字典比较lhsrhs内容,其内部等价于调用std::lexicographical_compare函数进行比较。 7中也是按字典序比较lhsrhs内容。...总结 list容器优势劣势: 优势 采用动态内存分配,不会造成内存浪费溢出。 执行插入删除操作十分方便、高效。修改指针即可,不需要移动大量元素。

49910

讲解“_snprintf”: 不是“std成员

讲解_snprintf: 不是std成员在C++编程中,有时候你可能会遇到一个错误,即_snprintf不是std成员。这个错误通常是因为你在项目中使用了编译器特定实现而不是标准C++库。...使用跨平台替代方案 如果你需要使用一个跨平台字符串格式化函数,你可以考虑使用std::snprintf。...总结_snprintf不是std成员错误通常在使用特定编译器项目中出现。...要解决这个错误,可以选择使用标准sprintf函数、跨平台std::snprintf函数,或者使用条件编译来根据不同编译器选择不同解决方案。...希望本文能够帮助你理解和解决_snprintf不是std成员错误,确保你C++代码能够在不同编译器中正常编译运行。

32210
领券