07|Coroutines背景:异步I/O的复杂性
同步与异步
- 深入了解
- 翻译
- 解释
- 总结
C++20之前,C++语言并未官方支持异步编程,导致开发者需要借助其他库或操作系统接口来实现异步I/O。本文介绍了同步与异步、并发与并行的概念,并强调了异步系统在提升计算机资源利用率方面的优势。文章探讨了C++传统异步I/O实现方法,特别是使用C++11线程库来实现消息循环。通过讲解线程库的核心std::thread类,文章展示了如何创建线程对象并等待其执行结束。文章以简单的代码示例和图表形象地解释了异步编程的概念和实现方式,为后续讨论C++ coroutines奠定了基础。 文章还介绍了使用C++11提供的promise和future来获取函数的处理结果和异常信息,实现更精细化的线程同步和线程调度。此外,文章提到了线程池的重要性,指出线程池可以更充分地利用CPU的并行、并发能力,同时避免给系统带来不必要的负担。最后,文章提出了课后思考问题,鼓励读者结合promise、future和mutex来实现能够处理结构化异常的线程池。 总的来说,本文深入探讨了C++异步编程的基本概念和实现方式,为读者提供了全面的技术视角和实践思路。文章内容丰富,涵盖了异步编程的多个方面,对于想要深入了解C++异步编程的读者来说,是一篇具有很高参考价值的文章。
《现代 C++20 实战高手课》,新⼈⾸单¥59
全部留言(6)
- 最新
- 精选
- Geek_7c0961同步, 异步, 阻塞, 非阻塞 这四个概念还是有必要区分清楚. 详见 https://www.cnblogs.com/lixinjie/p/a-post-about-io-clearly.html
作者回复: :thumbup:
2023-02-07归属地:美国2 - 王子面"static void count(int32_t maxValue)"声明为静态的原因是什么?
作者回复: C++里全局的static函数的意思是该符号仅对当前编译单元可见(internal linkage),防止各个编译单元之间符号因为链接性产生污染,这里我们项目只有一个编译单元,所以可加可不加。
2023-10-02归属地:美国 - 王子面“绝大多数异步计算都跟 I/O”的根本原因是什么?能不能举一两个跟I/O无关的异步计算的例子?
作者回复: 异步是个很广泛的概念,比如主线程启动了子线程T1、T2和T3,使用子线程进行计算,但是自己先去完成其他的任务,一定时间之后再回来获取子线程的计算结果(或者通过其他方式告知主线程计算任务完成)。这个过程中,主线程并没有等待子线程计算结果,这个过程就是异步的,但又不是I/O任务。
2023-10-02归属地:美国 - Geek_6778f9“接着,我们在 main 函数中创建了三个异步任务,给每个任务分别创建对应的目录。这三个任务会同时启动并独立执行。我们在这些线程对象上调用 join,让主线程等待这三个线程结束。” 老师,这里主线程需要等待子线程执行结束,我理解这是同步编程,为什么是异步?
作者回复: 这里主线程的确在同步等待三个任务,但是三个任务启动其实是并发同时执行的,所以三个任务之间是并发异步的
2023-04-28归属地:湖北 - peter请教老师两个问题: Q1:子线程之间可以用future和promise传递数据吗? Q2:结构化异常是什么意思?
作者回复: Q1:子线程之间一般不会使用future和promise传递数据,你可以把A线程的future/promise给B使用也能进行数据通信,但一般来说会使用其他的线程间通信方案。 Q2:结构化异常是微软对C语言的异常处理扩展(C语言不支持异常),感兴趣可以自己看一下SEH(Structured Exception Handling)的相关内容。 链接(仅供参考):https://learn.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170
2023-01-31归属地:北京 - Geek_7c0961github 上面的星最多的线程池实现, 可以收藏. https://github.com/progschj/ThreadPool/blob/master/ThreadPool.h2023-02-07归属地:美国2