如何“停止”正在等待条件变量的分离线程?

时间:2018-07-23 09:37:01

标签: c++ multithreading c++11

我从类B分离线程:

t1 = std::thread(&Class::method, this);
t1.detach();

作为正常操作的一部分,它会等待条件变量:

cv.wait(lock);

但是,当我关闭我的B应用程序时,分离的线程仍然存在。调用B::~B()时如何停止/清理该线程?

2 个答案:

答案 0 :(得分:2)

尝试以下代码段:将布尔成员变量discard_设置为true以避免执行计划的进程执行:

std::thread([&](){
   std::lock_guard<std::mutex> lock(mutex_);
   cv.wait(lock,[](){ return normal_predicate_here || discard_ ;});
   if(discard_) return;
   // execute scheduled process
}).detach();

答案 1 :(得分:2)

让其他线程配合终止。非分离线程使干净终止更容易,这样您就不会过早破坏其他线程访问的状态:

struct OtherThread {
    std::mutex m_;
    std::condition_variable c_;
    bool stop_ = false;
    std::thread t_;

    void thread_function() {
        for(;;) {
            std::unique_lock<std::mutex> l(m_);
            while(!stop_ /* || a-message-received */)
                c_.wait(l);
            if(stop_)
                return;

            // Process a message.
            // ...
            // Continue waiting for messages or stop.
        }
    }

    ~OtherThread() {
        this->stop();
    }

    void stop() {
        {
            std::unique_lock<std::mutex> l(m_);
            if(stop_)
                return;
            stop_ = true;
        }
        c_.notify_one();
        t_.join(); // Wait till the thread exited, so that this object can be destroyed.
    }
};