用 C++ 也可以写出 golang 的体验:
Coost 是一个 C++ 项目,它实现了类似 golang 的协程以及 golang 中的其他特性,下面截取几段代码贴上来,都是 C++ 代码哦。
创建协程
#include "co/co.h"
go(ku); // void ku();
go(f, 7); // void f(int);
go(&T::f, &o); // void T::f(); T o;
go(&T::f, &o, 7); // void T::f(int); T o;
go([](){
LOG << "hello go";
});
go()ff()(*f)()f(p)(*f)(p)(o->*f)()(o->*f)(p)
go()
auto s = co::next_scheduler();
s->go(f1);
s->go(f2);
如果用户想在所有的调度线程中创建协程,可以用下面的方式:
auto& s = co::schedulers();
for (size_t i = 0; i < s.size(); ++i) {
s[i]->go(f);
}
channel
co::Chan,类似于golang中的 channel,可用于在协程之间传递数据。
#include "co/co.h"
DEF_main(argc, argv) {
co::Chan<int> ch;
go([ch]() {
ch << 7;
});
int v = 0;
ch >> v;
LOG << "v: " << v;
return 0;
}
co::Chan<int> ch(8, 1000);
co::timeout()
waitgroup
sync.WaitGroup
#include "co/co.h"
DEF_main(argc, argv) {
FLG_cout = true;
co::WaitGroup wg;
wg.add(8);
for (int i = 0; i < 8; ++i) {
go([wg]() {
LOG << "co: " << co::coroutine_id();
wg.done();
});
}
wg.wait();
return 0;
}
defer
#include "co/defer.h"
Timer t;
defer(LOG << "time elapse: " << t.us() << "us");