拉不拉稀肚拉稀 发表于 2024-1-16 17:35:27

Structured Concurrency:结构化并发

一、参考

https://ericniebler.com/2020/11/08/structured-concurrency/
二、总结

1. 结构化并发是什么-概述

是什么:一种确保子操作在父操作之前完成的方式,类似函数在调用函数之前完成。
最典型的结构化并发:C++20的协程
意义:它通过使异步生存期与普通C++词法作用域相对应,为异步程序带来了现代C++风格,并且不需要引用计数(智能指针,垃圾回收)来管理对象的生命周期
总结:即使在并发环境中,函数嵌套调用时参数的作用域也是严格嵌套的,不需要用智能指针(shared_ptr)之类的技术,也不会发生不小心的内存泄露--对象的生命周期
2. 为什么需要结构化并发

2.1 结构化编程

具有严格的嵌套作用域和生命周期,并发情况下需考虑
2.2 多线程编程的困境

并发场景下编程难度大:
①对象生命周期已经结束,但是其他线程仍需要访问,会导致悬空引用问题,此时需要智能指针通过引用计数来管理其生命周期
②与作用域相关的生命周期不清晰
2.3 非结构化并发

非结构化异步编程很难保证正确性和效率,且编程复杂,且没有办法强制要求子任务在父任务之前完成
3. 结构化并发-深入

3.1 库

协程:Lewis Baker’s popular cppcoro library
提升:
①只需要一个函数
②状态保存在本地变量,而不需要保存在需要的引用计数的共享变量
③可使用一般的c++错误处理技术
④从结构保证了子操作在父操作之前完成
3.2 取消机制

从结构保证了子操作在父操作之前完成(也就是说,如果父操作先完成,需要等待子操作)
为了避免为不再需要结果的子操作等待不必要的长时间,我们需要一种能够取消这些子操作的机制,以便它们快速完成。
3.3 结构化并发>协程

结构化并发:特定模式中的回调,可以在没有协程的情况下实现结构化并发
4. 程序示例

场景:存在一个子操作,父任务需要此操作的结果
编译运行环境:ubuntu22.04.3
①单线程:主线程等待子线程结束
耗时操作:computeResult
调用者:doThing
#include #include struct State{        int result;};// synchronousvoid computeResult(State & s){        int time = 30;        sleep(time);        // 用sleep模拟耗时操作        s.result = time;}int doThing() {        State s;        computeResult(s);        return s.result;}int main(){        std::cout
页: [1]
查看完整版本: Structured Concurrency:结构化并发