上一条:内部共享 下一条:Rust 函数参数上的生命周期(lifetime)标记
在继续看 Rust 的生命周期之前,再对 C++ 生命周期做下回顾
C++ 从 C 继承而来,对象生命周期的核心问题是:
- 对象生命周期
- Stack上对象的释放,一旦超出对象的作用域,就自动Destruct对象。
- Heap上对象的释放,需要手动delete 来触发Destruct。
- 对象状态管理
- 在一个线程内,对象可被多处持有,单线程的多处持有点都可能修改对象的状态
- 在多个线程内,对象可被多线程持有,多线程可并发地修改对象的状态
先看下对象的生命周期:
再看下对象的状态管理:
- 单线程
- 不可变对象:可安全使用
- 可变对象:对象状态需要被`封装`才能处于尽量可控
- 例如把一个类的成员变量直接暴露出去,到处使用,就会带来封装泄漏,违反单一修改点原则
- 多线程
- 不可变对象:可安全使用
- 可变对象:对象状态处于多线程共享时,需要有互斥机制,例如信号量和互斥锁
- 并发修改对象,违反单一修改点原则
- 并发修改对象,如果不加互斥,会带来对象的状态修改处于`非原子`修改状态,A线程修改了一半,B对修改了一半的`脏数据`进行读写。