我有一个工作线程处理一些耗时的任务。出于某种原因,它开始使用_beginthreadex
和condition_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((可能会使程序状态不一致。线程持有的互斥将被锁定,内存被分配,打开的文件不会关闭等。