#include #include #include #include using std::cout; using std::endl; std::vector data; boost::shared_ptr > pro_ctx, con_ctx; void consume( void *) { bool done = false; while(!done) { cout << "Got " << data.size() << " items" << endl; if(data.size()<500) // dumb, but illustrates this function returning properly done = true; data.clear(); if(!done) con_ctx->jump_to(*pro_ctx); } cout << "Consumed all" << endl; } void plain_consume() { cout << "Got " << data.size() << " items" << endl; data.clear(); } void produce() { pro_ctx.reset(new boost::context<>()); con_ctx.reset(new boost::context<>(consume, *pro_ctx, 0, boost::protected_stack( 65536) )); for(int i=0; i<17; ++i) for(int j=0; j<53; ++j) for(int k=0; k<5; ++k) { data.push_back(i*j*k); if(data.size()==500) pro_ctx->jump_to(*con_ctx); // got enough data to consume } pro_ctx->jump_to(*con_ctx); // consume the last cout << "Done producing" << endl; } int main(int, char*[]) { produce(); return 0; }