sync(同步)
常用的同步对象:
Arc
:原子引用计数指针,可在多线程环境中使用该指针来延长某些数据的生命周期,直到所有线程都已使用完它。Barrier
:确保在继续一起执行之前,多个线程将彼此等待到达程序中的某个点。Condvar
:条件变量,提供在等待事件发生时阻止线程的功能。mpsc
:多生产者,单消费者队列,用于基于消息的通信。可以提供轻量级的线程间同步机制,但需要一些额外的内存。Mutex
:互斥机制,该机制确保一次最多只有一个线程能够访问某些数据。Once
:用于线程安全的全局变量的一次性初始化。RwLock
:提供一种互斥机制,该机制允许一次同时允许多个读者,而一次只允许一名作家。在某些情况下,这可能比互斥锁更有效。mpsc
mpsc分为两类:
同步
-
thread(线程)
future(期货)
task(任务)
并发
并发的最重要的两个应用:
同时有多个任务会同时占用cpu
- io密集和cpu密集
IO密集是是指需要进行系统调用。每次系统调用都需要阻塞进程等待系统调用完成,并发可充分利用此段时间,将cpu任务调入。
异步
Rust中的异步实现基于轮询,每个异步任务分成三个阶段:
- 轮询阶段(The Poll phase). 一个Future被轮询后,会开始执行,直到被阻塞. 我们经常把轮询一个Future这部分称之为执行器(executor)
- 等待阶段. 事件源(通常称为reactor)注册等待一个事件发生,并确保当该事件准备好时唤醒相应的Future
唤醒阶段. 事件发生,相应的Future被唤醒。 现在轮到执行器(executor),就是第一步中的那个执行器,调度Future再次被轮询,并向前走一步,直到它完成或达到一个阻塞点,不能再向前走, 如此往复,直到最终完成.
futures(期货)
future(期货):它是会某个确定时间却不知道具体时间的对象集合。类似于我们都会在某个时间死,但什么时候却不确定。死亡就是futures的一种。
期货最重要的属性是是否独立。rust将这种属性用于区分futures。furture分为:Non-leaf-futures 独立的
- leaf-futures 不独立的,某些Non-leaf-futures依赖于它。
leaf-future最常见的就是套接字。只有套接字连接成功,它才可以被写被读。(被操作)
Runtimes(运行时)
异步运行时的两部分:
从阻塞到唤醒。这些furture上都有着furture的特性,我们需要一个虚表来实现它。(vtable)waker使用trait 对象来创建。