19 | thread和future:领略异步中的未来
该思维导图由 AI 生成,仅供参考
为什么要使用并发编程?
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了并发编程的基本概念和相关技术,包括传统的多线程开发和高层抽象future的用法。文章首先解释了并发编程的必要性,随着计算需求的增加,程序员们需要面对并发性能的挑战。接着介绍了基于thread的多线程开发,展示了使用thread类创建线程的方法,并讨论了互斥量的基本语义以及C++标准库中提供的不同类型的互斥量。文章还提到了scoped_thread类的实现,以及建议使用lock_guard来避免手动加锁、解锁的麻烦。随后,文章引入了更高层的抽象future,通过示例展示了如何使用async函数和promise来简化并发编程代码。此外,还介绍了packaged_task的用法,展示了如何使用它来执行任务并获取结果。总的来说,本文全面介绍了并发编程的基本概念和相关技术,对于想要了解并发编程的读者具有很好的参考价值。
《现代 C++ 编程实战》,新⼈⾸单¥59
全部留言(22)
- 最新
- 精选
- 李公子胜治作者大大,你好,我在effective modern c++这本书上面看到,作者告诫我们平时写代码时,首先基于任务而不是线程,但是如果我们使用async时,实际上async还是为我们创建了一个新线程,还是没有体会到async比thread的优越性,难道仅仅是可以调用get(),获取async后的执行结果吗?
作者回复: 少写这么多代码,还没有优越性? 新功能很多是用来提高程序员的工作效率的。而且,脑子摆脱了底层细节,就更有空去思考更高层的抽象了。否则开发里到处是羁绊,只看到这个不能做,那个很麻烦。
2020-01-0824 - 风临老师教得很棒,学之前一头雾水,学之后醍醐灌顶,真是很享受。其实网上的教程很多,但是鱼龙混杂,自身没有经验的话,很难去分清多种方法的优劣,很可能片面甚至误导。所以跟着老师说真的很安心,因为质量很高,既全面又能让人看清楚趋势和方向
作者回复: 极客时间当然是会挑老师的啦😄。我和极客时间都很爱惜自己的名声,不好好写对不起读者,也对不起自己。
2020-04-149 - YouCompleteMe当时看<The C++ Programming>下册关于多线程的时候,还写了一些demo,现在看到future/async这些类,一点想不起来怎么用的-_-
作者回复: 一定是要多用,形成“肌肉记忆”才行。光读不用是真会忘的。
2020-01-0829 - 刘丹future执行get函数的时候,如果此时还没生成结果,是否get就阻塞了,直到有返回值为止呢?
作者回复: 是的,那时就阻塞等待了。
2020-03-055 - 皮皮侠模板部分终于看完了,玩过lamda和一些traits。跟着老师学了好多新东西,新思维,尤其是对编译期计算。对一些以前模糊的理论有了新的认识。这几篇以后肯定要回头继续把玩的。另外,我想老师花了这么多心血来写一些14、17、20的新特性,应该是希望让C++既能写出性能高的代码,也易于使用,简练,更适合上层业务逻辑,用心良苦。 蟹蟹老师的分享;)
作者回复: 理解满分!😁
2020-02-293 - even吴老师的课适合几度回味,多看几次,跟着敲代码,试着运行,慢慢的领会C++新特性,希望以后能够用上
作者回复: 对的,练习非常重要。要能够自然地自己写出现代C++代码了,才算学会了。
2020-04-0822 - 怪兽老师你好,想请问下shared_future,原文说“要么调用 future 的 share 方法来生成一个 shared_future,结果就可以在多个线程里用了——当然,每个 shared_future 上仍然还是只能调用一次 get 函数”。 意思是,async 返回的 future 作为共享资源被多个线程使用时,每个线程通过 future 的 share 方法获取到 shared_future,然后每个线程就可以调用get函数了,是这样吗? 另外,我在 MSVC 下测试,async 返回的 future,future.share() 得到 shared_future,shared_future 多次调用它的 get 方法也没有问题.
作者回复: 盲生,你发现了一个华点。 这个问题提得非常好。这里是我搞错了。future 和 shared_future 具有不同的接口。对于值对象类型,future<Obj>::get() 的返回值就是 Obj,是移动出来的。而 shared_future<Obj>::get() 的返回值是 const Obj&,就是可以多次读取的…… 我回头看看文本怎么修正一下。谢谢🙏。
2022-11-14归属地:江苏1 - 王大为最近用google的cpplint工具扫描了我的代码,但cpplint报告说不允许包含c++11的thread头文件,请问这个是出于什么目的呢? cpplint. py --verbose=5 my_cpp_file output : <thread> is an unapproved c++11 header 我看了一下cpplint脚本,里面确实对mutex thread chrono等头文件做了限制。
作者回复: 那是Google的偏好。除非你为Google的项目贡献代码,理它干嘛?
2020-01-0931 - 当初莫相识每次看线程都有新的收获,也有新的疑问。scoped_thread在析构函数时join,析构函数会等join完毕后销毁thread成员变量,对吗? scoped_thread th{work, ref(cv), ref(result)}; // 干一些其他事 cout << "I am waiting now\n"; unique_lock lock{cv_mut}; cv.wait(lock); cout << "Answer: " << result << '\n'; } main()函数里,我理解为scoped_thread直到}才会执行析构启动线程,而cv.wait又一直在阻塞,所以不会运行到}。虽然知道程序能得到预期结果,但逻辑上不理解,希望老师能解答我的困惑
作者回复: 析构时join,然后销毁thread成员变量是对的。 但不是析构时启动线程。thread在构造时就启动线程了。
2022-09-01归属地:上海 - 青鸟飞鱼老师,你好,关于条件变量应该如何退出呢? 比如说: void f() { while(m_isRun) { std::unique_lock<std::mutex> dataLock(m_mtx); while(m_list.empty()) { m_cond. wait(dataLock); } …… } } 线程函数如上面所写,这个线程如何安全退出呢?
作者回复: 没看出具体意义。如果你希望在wait那句后有可能退出,在那儿检查 m_isRun 不就行了?
2020-08-05