class interrupt_flag { public: void set(); bool is_set() const; }; thread_local interrupt_flag this_thread_interrupt_flag; class interruptible_thread { std::thread internal_thread; interrupt_flag* flag; public: template interruptible_thread(FunctionType f) { std::promise p; internal_thread=std::thread([f,&p]{ p.set_value(&this_thread_interrupt_flag); f(); }); flag=p.get_future().get(); } void interrupt() { if(flag) { flag->set(); } } };