在 C++ 中启动和停止线程中的循环
Start and Stop a loop within a Thread in C++
我需要从一个事件开始一个循环,然后从另一个事件停止它。我的想法是在按下按钮时调用函数 startDequeuing(),以便带有循环的线程启动,然后终止此循环,将"脱行"变量从函数 stopDequeuing() 变为 false。
这是我第一次使用线程,当我启动循环时程序会锁定,我认为是因为变量"dequeuing"被锁定并且无法从线程外部访问,我说得对吗?
我该如何解决这个问题?
这里有一些代码:
void CameraManager::startDequeuing(){
dequeuing = true;
std::thread dequeueThread(&CameraManager::dequeueLoop, this);
dequeueThread.join();
}
void CameraManager::stopDequeuing(){
dequeuing = false;
}
void *CameraManager::dequeueLoop(){
while(dequeuing){
highSpeedCamera->dequeue();
highSpeedCamera->enqueue();
}
}
使用线程的全部意义在于让多个函数并行运行。这里:
std::thread dequeueThread(&CameraManager::dequeueLoop, this);
dequeueThread.join();
启动第二个线程并将第一个线程置于睡眠状态,等待生成的线程返回。所以你仍然只有一个线程在运行。如果您有这种 GUI 事件循环,则可以锁定添加将在该事件循环为空时将被调用的回调的可能性。这可能使您能够在不使用线程的情况下执行所需的操作。
解决方案可能如下所示:
void CameraManager::startDequeuing(){
dequeuing = true;
dequeueThread = std::thread(&CameraManager::dequeueLoop, this);
}
void CameraManager::stopDequeuing(){
{
std::lock_guard<std::mutex> lock( mutex );
dequeuing = false;
}
dequeueThread.join();
}
bool CameraManager::keepOnDequeuing()
{
std::lock_guard<std::mutex> lock( mutex );
return dequeuing;
}
void *CameraManager::dequeueLoop(){
while( keepOnDequeuing() ){
highSpeedCamera->dequeue();
highSpeedCamera->enqueue();
}
}
程序死锁,因为join()
将阻塞,直到线程函数完成;到那时它永远不会完成,因为它正在有效地执行while(true)
。
您希望dequeueThread
成为班级的一员。为什么您希望它只在startDequeuing
范围内生存?
将dequeing
定义为原子布尔值:
#include <atomic>
std::atomic_bool dequeing = false;
它比使用互斥锁快得多,并且可以为您提供相同的同步。
相关文章:
- 为什么我不能在 while 循环中创建线程?
- 重新启动后,线程无法在 while 循环中再次运行
- 接受线程 C++ 套接字中的函数循环
- 使用 shared_ptr 在中断时结束多线程循环
- Qt 在另一个线程中无限循环
- 将执行循环拆分为多个线程 (1-N-1-N-1..)
- 循环中的线程 Runnin 用于对 c++ 中的数字求和
- 目标C++,如何在后台线程中使用运行循环?
- 在 While 循环中重用对象的多线程
- Qt 停止来自 GUI 线程的工作线程循环
- 如何等待内部线程循环
- 4D阵列C++的多线程循环
- 多线程循环的效率
- 将游戏服务器线程循环限制为 30FPS,而无需游戏引擎/渲染窗口
- 使用Sleep()或SetTimer的线程循环
- 如何使用固定的线程循环周期最小化CPU消耗
- 如何退出后台线程循环
- 在多线程循环中调用函数
- 使线程循环5次迭代;线程、互斥锁和信号
- c++多线程循环