diff --git a/src/serial_port.cpp b/src/serial_port.cpp index 5d133d7..4f9a2fb 100644 --- a/src/serial_port.cpp +++ b/src/serial_port.cpp @@ -50,11 +50,11 @@ void SerialPort::stop() stop_flag_ = true; running_ = false; - if (reader_thread_.joinable()) reader_thread_.join(); - - if (reconnect_thread_.joinable()) reconnect_thread_.join(); - + // 先关闭 fd,打断 reader 的阻塞 read() close_port(); + + if (reader_thread_.joinable()) reader_thread_.join(); + if (reconnect_thread_.joinable()) reconnect_thread_.join(); } bool SerialPort::open_port() @@ -138,6 +138,13 @@ void SerialPort::reader_loop() running_ = false; } +static void interruptible_sleep(std::atomic& stop_flag, int seconds) +{ + using namespace std::chrono; + for (int i = 0; i < seconds * 10 && !stop_flag.load(std::memory_order_relaxed); ++i) + std::this_thread::sleep_for(100ms); +} + void SerialPort::reconnect_loop() { int current_interval = retry_interval_; @@ -159,7 +166,7 @@ void SerialPort::reconnect_loop() { LOG_INFO("[" + id_ + "] Connect failed, retry in " + std::to_string(current_interval) + "s"); - std::this_thread::sleep_for(std::chrono::seconds(current_interval)); + interruptible_sleep(stop_flag_, current_interval); current_interval = std::min(current_interval * 2, max_interval); } }