enum State { IDLE, RUNNING, INTERRUPT };
std::mutex mutex_;
std::condition_variable cv_;
std::atomic<State> state_ = State::IDLE;
state_.store(State::RUNNING);
// 等待的地方,这里等待30s,当state_不是false时,或者超时时锁被解开
// 注意:条件变量condition_variable只能和unique_lock搭配(还有个condition_variable_any,不同的用法)
std::unique_lock<std::mutex> lock(mutex_);
auto status = cv_.wait_for(lock, std::chrono::milliseconds(1000 * 30), [&] { return state_.load() != State::RUNNING; });
if (!status) {
// timeout
// 做一些资源清理
} else if (state_.load() == State::INTERRUPT) {
// 锁被解开,但是是异常被解开
// 做一些资源清理
} else {
// 正常被解开
}
// 改变state_的地方,用于唤醒被阻塞的上面等待的线程
state_.store(State::INTERRUPT);
// state_.store(State::IDLE);
cv_.notify_all();