- #include <unistd.h> 
- #include <iomanip> 
- #include <iostream> 
- #include <thread> 
- #include <utility> 
-   
- class ManagedThread 
- { 
- public: 
-    template< class Function, class... Args> explicit ManagedThread( Function&& f, Args&&... args); 
-    ~ManagedThread() { mThread.join(); } 
-    bool isActive() const { return mActive; } 
- private: 
-    volatile bool  mActive; 
-    std::thread    mThread; 
- }; 
-   
- template< class Function, class... Args> 
-    void threadFunction( volatile bool& active_flag, Function&& f, Args&&... args) 
- { 
-    active_flag = true; 
-    f( args...); 
-    active_flag = false; 
- } 
-   
- template< class Function, class... Args> 
-    ManagedThread::ManagedThread( Function&& f, Args&&... args): 
-       mActive( false), 
-       mThread( threadFunction< Function, Args...>, std::ref( mActive), 
-                std::ref( f), std::forward< Args>( args)...) 
- { 
- } 
-   
- static void func() { std::cout << "thread 1" << std::endl; } 
-   
- int main() { 
-    ManagedThread  mt1( func); 
-    std::cout << "thread 1 active = " << std::boolalpha << mt1.isActive() << std::endl; 
-    ::sleep( 1); 
-    std::cout << "thread 1 active = " << std::boolalpha << mt1.isActive() << std::endl; 
-   
-    return 0; 
- } 
-   
				I2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8dXRpbGl0eT4KCmNsYXNzIE1hbmFnZWRUaHJlYWQKewpwdWJsaWM6CiAgIHRlbXBsYXRlPCBjbGFzcyBGdW5jdGlvbiwgY2xhc3MuLi4gQXJncz4gZXhwbGljaXQgTWFuYWdlZFRocmVhZCggRnVuY3Rpb24mJiBmLCBBcmdzJiYuLi4gYXJncyk7CiAgIH5NYW5hZ2VkVGhyZWFkKCkgeyBtVGhyZWFkLmpvaW4oKTsgfQogICBib29sIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQpwcml2YXRlOgogICB2b2xhdGlsZSBib29sICBtQWN0aXZlOwogICBzdGQ6OnRocmVhZCAgICBtVGhyZWFkOwp9OwoKdGVtcGxhdGU8IGNsYXNzIEZ1bmN0aW9uLCBjbGFzcy4uLiBBcmdzPgogICB2b2lkIHRocmVhZEZ1bmN0aW9uKCB2b2xhdGlsZSBib29sJiBhY3RpdmVfZmxhZywgRnVuY3Rpb24mJiBmLCBBcmdzJiYuLi4gYXJncykKewogICBhY3RpdmVfZmxhZyA9IHRydWU7CiAgIGYoIGFyZ3MuLi4pOwogICBhY3RpdmVfZmxhZyA9IGZhbHNlOwp9Cgp0ZW1wbGF0ZTwgY2xhc3MgRnVuY3Rpb24sIGNsYXNzLi4uIEFyZ3M+CiAgIE1hbmFnZWRUaHJlYWQ6Ok1hbmFnZWRUaHJlYWQoIEZ1bmN0aW9uJiYgZiwgQXJncyYmLi4uIGFyZ3MpOgogICAgICBtQWN0aXZlKCBmYWxzZSksCiAgICAgIG1UaHJlYWQoIHRocmVhZEZ1bmN0aW9uPCBGdW5jdGlvbiwgQXJncy4uLj4sIHN0ZDo6cmVmKCBtQWN0aXZlKSwKICAgICAgICAgICAgICAgc3RkOjpyZWYoIGYpLCBzdGQ6OmZvcndhcmQ8IEFyZ3M+KCBhcmdzKS4uLikKewp9CgpzdGF0aWMgdm9pZCBmdW5jKCkgeyBzdGQ6OmNvdXQgPDwgInRocmVhZCAxIiA8PCBzdGQ6OmVuZGw7IH0KCmludCBtYWluKCkgewogICBNYW5hZ2VkVGhyZWFkICBtdDEoIGZ1bmMpOwogICBzdGQ6OmNvdXQgPDwgInRocmVhZCAxIGFjdGl2ZSA9ICIgPDwgc3RkOjpib29sYWxwaGEgPDwgbXQxLmlzQWN0aXZlKCkgPDwgc3RkOjplbmRsOwogICA6OnNsZWVwKCAxKTsKICAgc3RkOjpjb3V0IDw8ICJ0aHJlYWQgMSBhY3RpdmUgPSAiIDw8IHN0ZDo6Ym9vbGFscGhhIDw8IG10MS5pc0FjdGl2ZSgpIDw8IHN0ZDo6ZW5kbDsKCiAgIHJldHVybiAwOwp9Cg==