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(运行时)

异步运行时的两部分:

  • 执行器(The Executor)
  • reactor (The Reactor)(期货表)

    waker唤醒器

    异步的三个阶段:

  • 轮询阶段

  • 等待阶段
  • 唤醒阶段

从阻塞到唤醒。这些furture上都有着furture的特性,我们需要一个虚表来实现它。(vtable)waker使用trait 对象来创建。