Где могут быть полезны корутины? Где нужна кооперативная многозадачность без многоядерности. Сетевые запросы, диск, сокеты, таймеры, обращения к базе данных, игровые боты, парсеры, движки рабочих процессов и анимационные последовательности. Некоторые задачи красиво ложатся на корутины.
Вот, к примеру, классическая задачка про
пять обедающих философов.

Каждый философ либо думает, либо кушает.
coro(int) void philosopher(int i)
{
int think = 1; // everyone gets hungry at once
for (;;) {
state[i] = 'T';
yield think;
state[i] = 'H';
while (!await try_to_eat(i))
yield rnd(1, 3); // back off, then try again
think = rnd(1, 4);
}
}
Для еды философу нужны две вилки, ведь на столе спагетти. Если вилки взять не удаётся (заняты соседями), философ ждёт.
coro(int) int try_to_eat(int i)
{
int left = i, right = (i + 1) % N;
await take(left, i);
defer put(left);
if (!await try_take(right, i))
return 0; // put(left) runs here
defer put(right);
state[i] = 'E';
meals[i]++;
yield rnd(1, 3); // eat
return 1; // put(right), then put(left)
}
Весь исходник программы здесь:
dining-philosophers.cПод gcc или clang корутины недоступны: вам понадобится компилятор
vcc. Собираем и запускаем программу:
$ vcc dining-philosophers.c -o dining-philosophers
$ ./dining-philosophers
tick 0 1 2 3 4 forks
0 T T T T T .....
1 E H E H H 00224
2 E H T H H 00.3.
3 E H T E H 00.33
4 T E H T E 411.4
5 T T E T E 4.224
6 H T E T T ..22.
7 E H T E T 00.33
8 E H T T T 00...
9 E H T E T 00.33
10 T E T T E 411.4
11 H T E H T ..22.
12 E T E H H 00224
13 E H E H H 0022.
14 T H T E H .1.33
15 H E H E H 01133
16 H E H E H .1133
17 H T H T E 4.2.4
18 H T E H E 4.224
19 H T T H E 4..34
20 H E T H T .11..
21 H E T E T 01133
22 H E H E T .1133
23 H T H T E 4.2.4
24 H T E T E 4.224
25 H H E H T .122.
26 H H E H H 0.224
27 E H T H H 00.3.
28 E H T E H 00.33
29 T E H E H .1133
30 T T H T E 4.2.4
31 H T E T E 4.224
32 H H E T T .122.
33 H H T T T 0....
34 E H T E T 00.33
35 T H T T E 4...4
36 T E T T E 411.4
37 H T E H T ..22.
38 E H E H T 0022.
39 E H T E H 00.33
meals: 6 6 7 8 6
forks still held after the table is cleared: 0
Я доработал компилятор, теперь корутины доступны на всех платформах. На Линуксе и маке, x86_64 и arm и riscv - везде.