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

Chapter 7: The Concurrency API

Make std::threads unjoinable on all paths 一个thread对象如果在析构时仍然是joinable,那么会使得程序终止运行 每个std::thread对象状态要么是...对于joinable线程,析构时析构函数通过detach断开了std::thread对象底层执行线程连接后,底层线程仍然在运行,此时thread所在函数占用内存已经回收,如果后面仍有函数调用的话...Be aware of varying thread handle destructor behavior 一个non-deferredstd::future一个joinablestd::thread...因为调用者future被调用者promise在传递结果时,这个结果既没有存放在promise,也没有存放在future,而是存放在一个堆对象代表shared state,而标准没有指定个对象行为...,此时线程间通信最佳方式是什么呢?

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

libcopp对C++20协程接入接口设计

而 callable_future task_future 相似度比较高,都会管理协程promise,那么我们为什么要把他们拆分成两个接口呢...显然我们并不希望每次有唤醒都去检查一次哪些任务完成了,哪些仍然要等待,这不但会有惊群效应,还会有很多冗余重置 caller 重新设置 caller 行为。...接入过程易踩坑点 首先,在 《libcopp接入C++20 Coroutine一些过渡期设计》 里提到 GCC 在MinGW环境下链接符号问题 在当前 GCC 12 已经修复了, GCC...(特别是 task_future generator_future 里 awaitablepromise对象之间交互时对 context 传递,一定是在单线程内。)...但是在 C++20 无栈协程,需要层层传递,层层创建。我预估整体开销应该是比之前使用有栈协程方案。前面提到编译器优化可以优化掉堆分配,但是协程本身开销并没有省去。

58620

跟面试官刚同步异步编程,有她完全够用了

lambda函数fun 输出线程id一个传入字符串 分别在新起线程当前线程调用他 auto fun = [](std::string a, std::mutex & lock) {...//使用mutex原因 两个线程都需要通过全局对象 std::cout来输出到屏幕 如果没有mutex 会打乱id字符串输出顺序 std::unique_lock...有没有更高效方式? 共享变量,函数参数返回值三种,更高效那就 future promise 吧 7,既然你提到了 future promise,你能说说他们是如何工作吗?...有线程12,线程1希望从线程2获取特定值,步骤如下: 线程1:创建promise对象,并从该对象获得对应future对象-> ->线程1将promise对象传递给线程...所以,我们可以使用std::async替代线程创建,让它成为我们做异步操作首选。

48920

C++并发编程 - 同步并发操作

在C++标准库, 有两种“期望”, 使用两种类型模板实现, 声明在头文件: 唯一期望(uniquefutures)( std::future )共享期望(shared futures)( std...即std::async、std::packaged_taskstd::promise会返回std::future类型,线程通过std::future获取任务执行结果。  ...std::promises 承诺与期望 std::promise对象可以保存某一类型 T 值,该值可被 future 对象读取(可能在另外一个线程),因此 promise 也提供了一种线程同步手段...在 promise 对象构造时可以一个共享状态(通常是std::future)相关联,并可以在相关联共享状态(std::future)上保存一个类型为 T 值。 ...针对std::async可能引发问题,告诫程序员们,一定要规范使用每一个接口,缺省参数及返回值不处理的话可能让代码裂成“东非大裂谷”。把接口参数返回值,不管有没有必要,都要处理。

1K40

C++并发低级接口:std::threadstd::promise

std::threadstd::promise 相比std::async,std::thread就原始多了。...虽然std::thread.detach()可以不阻塞主线程,但是如果主线程结束那这些后台任务都会强行终止,比如你后台是下载任务,所以几乎没有直接用detach,都是配合后面的同步机制如std::condition_variable...这里也凸显了std::async高级std::thread低级:在std::async我们可以对它返回值即std::future简单调用get()实现同步等待甚至能获取任务结果,但是std...多说一点,其实std::promisestd::future都是多线程状态共享方案,这两种不存在高级低级,只有std::asyncstd::thread有点高级低级之分。...不过《C++标准库》这样分类,加之std::future,std::promise分别用于std::asyncstd::thread示例,我也只能照做了;)

2.2K40

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

在任何语言多线程编程当中,必然涉及线程同步及数据共享,方式也有很多种。 C++ 标准库当中提供了同步及共享方案std::futurestd::promise 。...【语法】【伪代码】std::future name(promise.get_future()); 【负责存储】std::promise 也是一个模板类,它提供了存储异步执行异常一种方式...4,std::promise 在作为使用者异步线程当中,应当注意共享变量生命周期、是否被 set 问题。如果没有共享值没有被 set,而异步线程却结束,future 端会抛出异常。...std::shared_future 与 std::packaged_task std::future 有个非常明显问题,就是只能一个 std::promise 成对绑定使用,也就意味着仅限于两个线程之间使用...若 policy 设置了 std::launch::async  std::launch::deferred 两个标志,则进行异步执行还是惰性求值取决于实现。

1.2K30

再也不用std::thread编写多线程了

::futurestd::shared_future * *基于任务std::async 基于线程std::thread */ int sys = 1; int doAsyncWork()...以等待它期望,该wait调用会阻塞反应任务到 * std::promise型别对象被设置为止 * * 2,发生端std::promise,接收端 std::futurestd::shared_future...:promise期望值之间是共享状态,而共享状态通常是动态分配,因此,你就得假设这种设计会招致在堆上进行分配回收成本 * * 3,std::promise型别对象只能设置一次,它期望值之间通信通道是个一次性机制...* * 1,关键在 react代码中使用std::shared_futures而非std::future,前者是把共享状态所有权转移给了由share生成 * std::shared_future...* * c++98肯定会发生,无论调用方传入是什么,形参newName都会经过复制构造函数创建 * * 不过,在C++11,newName仅在传入左值时候才会被复制构造,若传入右值,会被移动构造

2.3K40

读 NebulaGraph源码 | 查询语句 LOOKUP 一生

); // 这里开始 DAG 物理计划执行 // 调度是基于 folly Promise Future 异步调用展开 return doSchedule(executor); }...也就是说,如果这个算子依赖了某些算子,只有它们许诺兑现了(promise set value),这里 future 才能得到处理 std::unordered_map<int64_t, std:...)); queue.push(root); visited.emplace(root); // 开始 DAG 访问图计算节点,生成每一个节点 promise future while...LOOKUP 语句算子在执行什么? 上面我介绍了物理算子通过 folly 三方库 Promise Future 异步编程模型来实现调度执行。...有很多细节没有展开,后续文章我们将不断展开。其实,对于任意一个语句,基本执行流程 LOOKUP 一生都类似,其中有不同地方就是额外算子不同,算子之间处理逻辑不同。

1.4K40

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

future,然后通过future来获取想要得到结果。... std::promise是一个类模板,它作用是在不同线程实现数据同步,与future结合使用,也间接实现了future在不同线程间同步。...thread t(fun, 1, std::ref(p)); std::cout << fu.get() << std::endl; // 当promise没有时候在此等待...需要注意是在使用过程不能多次set_value(),也不能多次get_future()多次get(),因为一个promise对象只能一个对象相关联,否则就会抛出异常。...std::async        其实这个函数是对上面的对象一个整合,async先将可调用对象封装起来,然后将其运行结果返回到promise,这个过程就是一个面向future一个过程,最终通过future.get

14.6K30

【译文】Rust futures: async fnthread::sleep阻塞调用

你已经读了这篇文章标题,可能会猜到get_bookget_music是按顺序执行。但为什么!?异步fn所有内容不是都应该同时运行吗?...为什么async不行? 我不会在这里深入讨论futuresasync/await(本书是一个很好起点)。我只想指出造成困惑两个可能根源: std::thread::sleep 会阻塞?...但是文档没有明说“此调用是阻塞,你不应该在异步上下文中使用它”,并且非系统程序员可能不会过多地考虑“将当前线程置于睡眠状态”。...你可以找到一个异步替代方案:当thread::sleep阻塞时,你可以使用它们(取决于你选择运行时生态系统): async_std::task::sleep (1.0) tokio::time::delay_for...(0.2.0) tokioasync_std都为其他阻塞操作(例如文件系统tcp流访问)提供了异步替代方法。

2.8K20

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

std::promise也是一个类模板,可以基于std::promise实现线程之间数据传输。 构造一个std::promise对象时,可以std::future对象相互关联。...std::thread启动线程如果抛出了异常,且异常没有被线程本身处理时候,这个线程会导致整个应用程序发生终止。...std::future可以很方便地获取线程执行结果,如果线程抛出了异常,std::future可以将异常转移到另一个线程,让另一个线程来处理异常。...} } 运行结果: Caught exception: Exception throw from CalculateSum. 2.std::promisestd::future区别 同一个线程或者另一个线程将线程函数计算结果放入到...std::promise,而std::future可以获取std::promise存储线程计算结果。

30610

来聊聊C++中头疼线程、并发

因为一旦主线程执行完,相应资源就被释放了。 //但是对象本身ta还在吗?不在了。那为什么thread还能正常运行?因为创建thread时创建副本在子线程运行。...线程A锁了金锁,需要去锁住银锁;然而线程B锁了银锁,需要去锁住金锁,这样AB都在等待对方释放锁。就成了死锁。 死锁一般解决方案:只要保证两个互斥量上锁顺序一致就不会死锁。...如果wait()或者get()没有调用则不会执行线程. eg: std::async(std::launch::deferred,my_thread)可以测试线程id,延迟调用,其实没有创建新线程,是在主线程调用线程入口函数...std::future fu=myprom.get_future();//promisefuture绑定,用于获取线程返回值 auto result=fu.get(); }...然而CAS过程其实没有获取释放锁。它运行JMM内存模型没有关系。

4.6K41

UNIX(多线程):12---async、future、packaged_task、promise

"future": 将来意思,有人也称呼std::future提供了一种访问异步操作结果机制,就是说这个结果你可能没有办法马上拿到,但不久将来, 什么叫“启动一个异步任务”,就是自动创建一个线程并开始执行对应线程入口函数...std::launch::deferred: 延迟调用,并且没有创建新线程,是在主线程调用线程入口函数。 ? ?...std::promise 我们能够再某个线程给它赋值,然后我们可以再其他线程,把这个值取出来用。...::get_id() << endl; //打印主线程id std::promise var_pro; //创建一个promise对象,用来保存int类型std::thread objThread.../获取结果 objThread.join(); std::future t1 = var_pro.get_future(); //promise线程绑定,用于获取线程返回值 std::thread

41420

【C++11】 让多线程开发变得简单--异步操作

C++ 11提供了异步操作相关类函数,不同类具备不同功能,总体来说类主要有:std::future,std::promise,std::package_task,函数主要是std::async。...1 异步操作类 上面三个类主要功能是: std::future:该类主要作为异步结果传输通道,方便获取线程函数返回值; std::promise:用来包装一个值,futre绑定使用,方便线程赋值;...1.1 std::futurethread库中提供了该future访问异步操作结果,由于异步结果不能马上取得,只能在未来某个时候进行获取,这个结果是一个未来值,因此叫做future。...= std::future_status::ready); 1.2 std::promise 使用std::promise可以实现在两个不同线程之间数值传递。...0; } 程序运行结果为:iRes=5 2 异步操作函数:async 相对前面的异步操作类,std::async要高级多,且可以直接创建异步task类,异步返回结果保存在future,在获取线程函数返回结果时

61630

《C++并发编程实战》读书笔记(2):并发操作同步

中提供了两种类模板futureshared_future,同一事件仅可关联一个future实例,但可关联多个shared_future,并且目标事件发生后关联所有shared_future...promise通过get_future获取关联future对象,等待数据线程在future上阻塞,提供数据线程通过set_value设置数据,设置完后future即就绪。...(true); } } } } async与packaged_task运行函数抛出异常时会保存在future对象,调用get时再次抛出。...std::chrono库时钟是时间信息来源,每个时钟类都提供当前时刻now、时间值类型time_point、计时单元长度ratio、计时速率是否恒定is_steady。...C++20还提出两个新特性:latchbarrier。latch是一个同步对象,内含计数器,减到0时就绪。

30520

C++核心准则CP.61:使用async启动并发任务

R.12告诉我们避免原始所有权指针,本规则告诉我们:如果可能应该避免原始线程promise。使用像std::async一样工厂函数,它可以可以启动重新使用线程而不必向外部代码保护原始线程。...不幸是,std::async并不完美。例如,它没有使用线程池,这意味着它可能因为资源枯竭而失败,而不是将任务排队等候执行。...然而,即使你不能使用std::async,你还是可以编写自己返回future工厂函数,而不是使用原始promise。...示例代码演示了两种不同成功使用std::future方式,但是没能避免使用原始std::thread。...示例代码显示了你可以遵守,由std::async设定通常模式,这种模式可以用于开发过程std::async无法直接使用情况。

57510
领券