Boost.Context はじめました

最近何かと目にする Boost.Context をちょっとつついてみました

[ビルド]

最新版の trunk だと今まで通り bjam を叩けばライブラリが生成されるみたいです。
上記の github に上がっているソースだとうまく出力されなかったので、わたしはここら辺を参照して自力でビルドしました。

[ソース]

#include <boost/context/all.hpp>
#include <iostream>

void
func(boost::contexts::context& ctx, std::string const& str){
    for(std::string::const_iterator it = str.begin() ; it != str.end() ; ++it){
        std::cout << *it;
        ctx.suspend();
    }
}

int
main(){
    namespace c = boost::contexts;

    c::context ctx;

    ctx = c::context(
        // 呼ばれる関数
        boost::bind(&func, boost::ref(ctx), "hello, world"),
        c::default_stacksize(),
        c::no_stack_unwind,
        c::return_to_caller
    );

    // 引数をそのまま渡すことも出来る
//  ctx = c::context(
//      &func,
//      boost::ref(ctx),
//      "hello, world",
//      c::default_stacksize(),
//      c::no_stack_unwind,
//      c::return_to_caller
//  );
    
    std::cout << "start" << std::endl;
    ctx.start();

    while( !ctx.is_complete() ){
        std::cout << " ";
        ctx.resume();
    }
    std::cout << "\n";
    std::cout << "done" << std::endl;

    return 0;
}

[出力]

start
h e l l o ,   w o r l d 
done

一体どんな仕組みで実装されているのか何に使うのかはまだイマイチよくわかっていませんが、面白いですね。
重い処理とかを分割して処理したりするのかしら?