用 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");