gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:14:59 27 4
gpt4 key购买 nike

我有一个类来启动另一个线程,该线程以恒定的时间间隔访问其某些数据。这意味着我有两个访问相同数据的线程(原始线程和新创建的线程)。这引入了对互斥锁的需求。一切顺利,直到调用了该类的析构函数为止(在程序末尾)并且内存位置不再有效。在这一点上,新线程尝试访问数据并获得访问冲突错误(很明显)。
我想做的是在析构函数中停止线程,或者在线程“通知”类实例已被破坏后停止线程。
这是简化的线程代码(为简洁起见,使用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)
并进行适当的同步。要么不分离线程(这样析构函数就可以加入它),要么不添加某种方式使线程表明它已经退出了(所以析构函数可以等待它)。
哦,线程应该休眠,而不是旋转。在那种情况下,如果您不希望析构函数也阻塞,则需要某种方式来中断 sleep :对条件变量使用定时等待来使 sleep 变得容易。

关于c++ - C++在析构函数中杀死线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65428348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com