fix(sleeper-thread): stop and join before worker reassignment
Reassigning SleeperThread could replace a joinable std::thread and trigger std::terminate. I now stop and join any existing worker before reassignment, then reset control state before starting the replacement worker. Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
This commit is contained in:
@@ -42,6 +42,15 @@ class SleeperThread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SleeperThread& operator=(std::function<void()> func) {
|
SleeperThread& operator=(std::function<void()> func) {
|
||||||
|
if (thread_.joinable()) {
|
||||||
|
stop();
|
||||||
|
thread_.join();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lck(mutex_);
|
||||||
|
do_run_ = true;
|
||||||
|
signal_ = false;
|
||||||
|
}
|
||||||
thread_ = std::thread([this, func] {
|
thread_ = std::thread([this, func] {
|
||||||
while (do_run_) {
|
while (do_run_) {
|
||||||
signal_ = false;
|
signal_ = false;
|
||||||
@@ -92,7 +101,7 @@ class SleeperThread {
|
|||||||
condvar_.notify_all();
|
condvar_.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto stop() {
|
void stop() {
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lck(mutex_);
|
std::lock_guard<std::mutex> lck(mutex_);
|
||||||
signal_ = true;
|
signal_ = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user