C ++在析构函数中杀死线程

鱼雷

我有一个类来启动另一个线程,该线程以恒定的间隔访问其某些数据。这意味着我有两个线程访问相同的数据(原始线程和新创建的线程)。这引入了对互斥锁的需求。一切顺利,直到调用了该类的析构函数为止(在程序末尾)并且内存位置不再有效。在这一点上,新线程尝试访问数据并获得访问冲突错误(显然)。

我想做的是在析构函数中停止线程,或者在线程“通知”类实例已被破坏后停止线程。

这是简化的线程代码(为简洁起见,使用typedef):

void myClass::StartThread() {
    auto threadFunc = [&, this]() {
        while (true) {
            time_point now = steady_clock::now();
            if (chro::duration_cast<chro::milliseconds>(now - this->m_lastSeedTime).count() > INTERVAL) {
                std::lock_guard<std::mutex> lockGuard(this->m_mut);
                this->m_lastSeedTime = now;
                this->accessData();
            }
        }
    };
    std::thread thread(threadFunc);
    thread.detach();

当然,如果我只是以某种明显的方式处理错误,也请让我知道。

无用

如果您希望线程死亡,则应要求其退出。这是干净整洁的唯一可靠方法。

只是改变

while (true)

while(this->keepRunning)

并进行适当的同步。要么不分离线程(以便析构函数可以加入它),要么添加某种方式使线程表明它已经退出(以便析构函数可以等待它)。

哦,线程应该休眠,而不是旋转。在那种情况下,如果您不希望析构函数也阻塞,则需要某种方式来中断睡眠:对条件变量使用定时等待来使睡眠变得容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章