#include <iostream>
#include <thread>
#include <functional>
using namespace std;
class uart {
public :
void init( ) { cout << this << " is initalized" << endl; }
void read( ) { cout << this << " is read" << endl; }
static void static_read( uart& self) { cout << "static read on " << & self<< endl; }
} ;
int main( ) {
uart u;
u.init ( ) ;
u.read ( ) ;
cout << "t1" << endl;
thread t1( uart:: static_read , ref( u) ) ;
t1.join ( ) ;
cout << "t2" << endl;
thread t2( [ ] ( uart& self) { self.read ( ) ; } , ref( u) ) ;
t2.join ( ) ;
cout << "t3" << endl;
thread t3( & uart:: read , ref( u) ) ;
t3.join ( ) ;
cout << "t4" << endl;
auto read_my_uart = bind( & uart:: read , ref( u) ) ; // without ref it would compile but execute on clone
thread t4( read_my_uart) ;
t4.join ( ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIHVhcnQgewpwdWJsaWM6IAoJdm9pZCBpbml0KCkgeyBjb3V0PDx0aGlzPDwiIGlzIGluaXRhbGl6ZWQiPDxlbmRsOyB9Cgl2b2lkIHJlYWQoKSB7IGNvdXQ8PHRoaXM8PCIgaXMgcmVhZCI8PGVuZGw7IH0KCXN0YXRpYyB2b2lkIHN0YXRpY19yZWFkKHVhcnQmIHNlbGYpeyBjb3V0PDwic3RhdGljIHJlYWQgb24gIjw8JnNlbGY8PGVuZGw7fQp9OwoKaW50IG1haW4oKSB7Cgl1YXJ0IHU7IAoJdS5pbml0KCk7IAoJdS5yZWFkKCk7IAoJCgljb3V0PDwidDEiPDxlbmRsOyAKCXRocmVhZCB0MSh1YXJ0OjpzdGF0aWNfcmVhZCwgcmVmKHUpKTsKCXQxLmpvaW4oKTsgCgkKCWNvdXQ8PCJ0MiI8PGVuZGw7IAoJdGhyZWFkIHQyKFtdKHVhcnQmc2VsZil7c2VsZi5yZWFkKCk7fSwgcmVmKHUpKTsgCgl0Mi5qb2luKCk7IAoJCgljb3V0PDwidDMiPDxlbmRsOyAKCXRocmVhZCB0MygmdWFydDo6cmVhZCwgcmVmKHUpKTsgCgl0My5qb2luKCk7IAoJCgljb3V0PDwidDQiPDxlbmRsOyAKCWF1dG8gcmVhZF9teV91YXJ0ID0gYmluZCgmdWFydDo6cmVhZCwgcmVmKHUpKTsgLy8gd2l0aG91dCByZWYgaXQgd291bGQgY29tcGlsZSBidXQgZXhlY3V0ZSBvbiBjbG9uZSAKCXRocmVhZCB0NChyZWFkX215X3VhcnQpOyAKCXQ0LmpvaW4oKTsgCgkKCXJldHVybiAwOwp9