#include <iostream>
#include <thread>
void thread_function_ref( int const & x)
{
std:: cout << "thread_function_ref, x = " << x<< std:: endl ;
}
void thread_function_value( int x)
{
std:: cout << "thread_function_value, x = " << x<< std:: endl ;
}
void thread_function_non_const( int & x)
{
x++ ;
std:: cout << "thread_function_non_const, x = " << x<< std:: endl ;
}
int main( )
{
int x = 9 ;
std:: thread threadObj1( thread_function_value, x) ;
std:: thread threadObj2( thread_function_ref, std:: ref ( x) ) ;
std:: thread threadObj3( thread_function_non_const, std:: ref ( x) ) ;
std:: cout << "In Main Thread : Before Thread Start x = " << x<< std:: endl ;
threadObj1.join ( ) ;
threadObj2.join ( ) ;
threadObj3.join ( ) ;
std:: cout << "In Main Thread : After Thread Joins x = " << x<< std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgp2b2lkIHRocmVhZF9mdW5jdGlvbl9yZWYoaW50IGNvbnN0ICYgeCkKewogICAgc3RkOjpjb3V0PDwidGhyZWFkX2Z1bmN0aW9uX3JlZiwgeCA9ICI8PHg8PHN0ZDo6ZW5kbDsKfQoKdm9pZCB0aHJlYWRfZnVuY3Rpb25fdmFsdWUoaW50IHgpCnsKICAgIHN0ZDo6Y291dDw8InRocmVhZF9mdW5jdGlvbl92YWx1ZSwgeCA9ICI8PHg8PHN0ZDo6ZW5kbDsKfQoKdm9pZCB0aHJlYWRfZnVuY3Rpb25fbm9uX2NvbnN0KGludCYgeCkKewogICAgeCsrOwogICAgc3RkOjpjb3V0PDwidGhyZWFkX2Z1bmN0aW9uX25vbl9jb25zdCwgeCA9ICI8PHg8PHN0ZDo6ZW5kbDsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgeCA9IDk7CiAgICBzdGQ6OnRocmVhZCB0aHJlYWRPYmoxKHRocmVhZF9mdW5jdGlvbl92YWx1ZSwgeCk7CiAgICBzdGQ6OnRocmVhZCB0aHJlYWRPYmoyKHRocmVhZF9mdW5jdGlvbl9yZWYsIHN0ZDo6cmVmKHgpKTsKICAgIHN0ZDo6dGhyZWFkIHRocmVhZE9iajModGhyZWFkX2Z1bmN0aW9uX25vbl9jb25zdCwgc3RkOjpyZWYoeCkpOwogICAgc3RkOjpjb3V0PDwiSW4gTWFpbiBUaHJlYWQgOiBCZWZvcmUgVGhyZWFkIFN0YXJ0IHggPSAiPDx4PDxzdGQ6OmVuZGw7CiAgICB0aHJlYWRPYmoxLmpvaW4oKTsKICAgIHRocmVhZE9iajIuam9pbigpOwogICAgdGhyZWFkT2JqMy5qb2luKCk7CiAgICBzdGQ6OmNvdXQ8PCJJbiBNYWluIFRocmVhZCA6IEFmdGVyIFRocmVhZCBKb2lucyB4ID0gIjw8eDw8c3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0=