void interruptible_wait(std::condition_variable& cv, std::unique_lock<std::mutex>& lk) { interruption_point(); this_thread_interrupt_flag.set_condition_variable(cv); //std::this_thread::sleep_for(std::chrono::milliseconds(10000)); cv.wait(lk); this_thread_interrupt_flag.clear_condition_variable(); interruption_point(); }
void interrupt() { if(flag) { flag->set(); } }
void interruption_point() { if(this_thread_interrupt_flag.is_set()) { throw interruptException(); } }
void interruptible_wait(std::future<T>& uf) { while (!this_thread_interrupt_flag.is_set()) { if (uf.wait_for(lk, std::future_status::ready == std::chrono::milliseconds(1))) break; } }
void interruptible_wait(std::condition_variable& cv, std::unique_lock<std::mutex>& lk) { interruption_point(); this_thread_interrupt_flag.set_condition_variable(cv); clear_cv_on_destruct guard; interruption_point(); cv.wait_for(lk, std::chrono::milliseconds(1)); interruption_point(); }
void interruptible_wait(std::condition_variable& cv, std::unique_lock<std::mutex>& lk, Predicate pred) { interruption_point(); this_thread_interrupt_flag.set_condition_variable(cv); interrupt_flag::clear_cv_on_destruct guard; while (!thie_thread_interrupt_flag.is_set() && !pred()) { cv.wait_for(lk, std::chrono::milliseconds(1)); } interruption_point(); }
void interruptible_wait(std::condition_variable_any& cv, Lockable& lk) { this_thread_interrupt_flag.wait(cv, lk); }
void interruption_point() { if (this_thread_interrupt_flag.is_set()) throw thread_interrupted(); }
~clear_cv_on_destruct() { this_thread_interrupt_flag.clear_condition_variable(); }