-
Notifications
You must be signed in to change notification settings - Fork 2
/
waitgroups.cpp
63 lines (54 loc) · 1.01 KB
/
waitgroups.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// https://gobyexample.com/waitgroups
//
// package main
//
// import (
// "fmt"
// "sync"
// "time"
// )
//
// func worker(id int) {
// fmt.Printf("Worker %d starting\n", id)
//
// time.Sleep(time.Second)
// fmt.Printf("Worker %d done\n", id)
// }
//
// func main() {
// var wg sync.WaitGroup
//
// for i := 1; i <= 5; i++ {
// wg.Add(1)
//
// i := i
//
// go func() {
// defer wg.Done()
// worker(i)
// }()
// }
//
// wg.Wait()
// }
#include <eo/fmt.h>
#include <eo/sync.h>
#include <eo/time.h>
using namespace eo;
func<> worker(int id) {
fmt::print("Worker {:d} starting\n", id);
co_await time::sleep(std::chrono::seconds(1));
fmt::print("Worker {:d} done\n", id);
}
func<> eo_main() {
auto wg = std::make_shared<sync::WaitGroup>();
for (auto i = 1; i <= 5; i++) {
wg->add(1);
go([wg, i]() -> func<> {
eo_defer([&]() { wg->done(); });
co_await worker(i);
});
}
wg->wait();
co_return;
}