协程_概述

多线程的缺陷

  1. 多线程是微秒级别。
  2. 线程数一多,CPU使用率会飙升。可扩展性比较差
  3. 编写异步逻辑、非阻塞事件时,函数回调方式只有编写程序的程序员才知道规则。

协程的目的

  1. 描述异步逻辑
    1. 比多线程更快
    2. 比函数回调更美观

协程的优势

  1. 性能强劲
    1. 协程切换实验 - 一次协程切换的开销可以达到2到3纳秒之间,单线程协程切换的时间可以达到7到8纳秒,跨线程的协程切换也只需37纳秒左右。这些时间大大快于线程切换的时间。线程切换至少需要2000个时钟周期。假设CPU为4GHz,则至少需要500ns,若考虑cache失效问题,协程效率相对于线程将会是10、100倍的数量级。
  2. 语法优雅

实验:测量协程切换开销

写两个协程,使其不断切换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
constexpr uint32_t total_switch = 2e9; // 2 * 10^9

int count = 0;

task<> f(const swtch &to)
{
while (count++ < total_switch)
{
co_await to;
}
}
int main()
{
swtch to[2];
task<> tasks[2] = {f(to[0]), f(to[1])};
to[0].target = task[1].get_handle();
to[1].target = task[0].get_handle();

auto duration = hostTiming([&] {task[0].get_handle().resume(); });

}

循环对计数器累加,每次都切换一次协程。