我有一个类来启动另一个线程,该线程以恒定的间隔访问其某些数据。这意味着我有两个线程访问相同的数据(原始线程和新创建的线程)。这引入了对互斥锁的需求。一切顺利,直到调用了该类的析构函数为止(在程序末尾)并且内存位置不再有效。在这一点上,新线程尝试访问数据并获得访问冲突错误(显然)。
我想做的是在析构函数中停止线程,或者在线程“通知”类实例已被破坏后停止线程。
这是简化的线程代码(为简洁起见,使用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] 删除。
我来说两句