当工作线程中有耗时的任务运行时,如何终止线程



我有一个工作线程处理一些耗时的任务。出于某种原因,它开始使用_beginthreadexcondition_variable来等待任务。代码看起来像:

void MyThread::worker()
{
while(true)
{
unique_lock<mutex> ulk(mut_);
cv_.wait(ulk, [this](){return !this->TasksQueueEmpty() || this->ShouldTerminate();});
if(ShouldTerminate())
break;
auto task = GetTaskFromQueue();
ulk.unlock();
task.Run(); 
}
}
void MyThread::terminate()
{
unique_lock<mutex> ulk(mut_);
SetTerminate();
cv_.notify_one();
}

这里task.Run()是一项非常耗时的工作。我想随时解雇这名工人,不用等。似乎TerminateThread可能会导致某些资源处理异常。有变通办法吗?

terminate((函数还应该设置一个布尔标志,task.run((函数应该经常检查该标志,以便快速停止。

Terminatethread((可能会使程序状态不一致。线程持有的互斥将被锁定,内存被分配,打开的文件不会关闭等。

最新更新