#include <iostream>
#include <thread>
#include <chrono>
void foo( )
{
// simulate expensive operation
std:: this_thread :: sleep_for ( std:: chrono :: seconds ( 1 ) ) ;
}
void bar( )
{
// simulate expensive operation
std:: this_thread :: sleep_for ( std:: chrono :: seconds ( 1 ) ) ;
}
int main( )
{
std:: cout << "starting first helper...\n " ;
std:: thread helper1( foo) ;
std:: cout << "starting second helper...\n " ;
std:: thread helper2( bar) ;
std:: cout << "wait main thread a 1 second\n " ;
std:: this_thread :: sleep_for ( std:: chrono :: seconds ( 1 ) ) ;
std:: cout << "waiting for first to finish...\n " ;
helper1.join ( ) ;
std:: cout << "wait main thread a 1 second\n " ;
std:: this_thread :: sleep_for ( std:: chrono :: seconds ( 1 ) ) ;
std:: cout << "waiting for second to finish...\n " ;
helper2.join ( ) ;
std:: cout << "done!\n " ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8Y2hyb25vPgogCnZvaWQgZm9vKCkKewogICAgLy8gc2ltdWxhdGUgZXhwZW5zaXZlIG9wZXJhdGlvbgogICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKfQogCnZvaWQgYmFyKCkKewogICAgLy8gc2ltdWxhdGUgZXhwZW5zaXZlIG9wZXJhdGlvbgogICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKfQogCmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8ICJzdGFydGluZyBmaXJzdCBoZWxwZXIuLi5cbiI7CiAgICBzdGQ6OnRocmVhZCBoZWxwZXIxKGZvbyk7CiAKICAgIHN0ZDo6Y291dCA8PCAic3RhcnRpbmcgc2Vjb25kIGhlbHBlci4uLlxuIjsKICAgIHN0ZDo6dGhyZWFkIGhlbHBlcjIoYmFyKTsKCiAgICBzdGQ6OmNvdXQgPDwgIndhaXQgbWFpbiB0aHJlYWQgYSAxIHNlY29uZFxuIjsKICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7CgogICAgc3RkOjpjb3V0IDw8ICJ3YWl0aW5nIGZvciBmaXJzdCB0byBmaW5pc2guLi5cbiI7CiAgICBoZWxwZXIxLmpvaW4oKTsKCiAgICBzdGQ6OmNvdXQgPDwgIndhaXQgbWFpbiB0aHJlYWQgYSAxIHNlY29uZFxuIjsKICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCAid2FpdGluZyBmb3Igc2Vjb25kIHRvIGZpbmlzaC4uLlxuIjsKICAgIGhlbHBlcjIuam9pbigpOwogCiAgICBzdGQ6OmNvdXQgPDwgImRvbmUhXG4iOwp9