【发布时间】:2015-11-22 18:48:16
【问题描述】:
我知道这个问题已被多次询问和回答,并且我知道结束线程的最佳方法是使用标志并在请求时退出线程函数。这也是我目前正在做的,但是我的问题是线程函数运行的时间很长,所以有时我需要等待几个小时,直到线程结束。我的线程函数看起来像这样:
void threadfunction()
{
while(!exitRequested)
{
doSomeWork();
object1.doSomeWork();
object2.doSomeWork();
while(somecondition)
{
object3.doSomeWork();
}
object4.doSomeWork();
}
}
这只是一个示例,实际上代码看起来要复杂得多。但我想演示的是,我调用了几个类方法,这些方法可能需要几个小时才能完成(每个函数)。
所以我现在正在做的是检查函数之间是否请求退出(例如在object1.doSomeWork(); 和object2.doSomeWork(); 之间)但是正如我所说的函数调用可能需要几个小时,所以我需要检查是否在这些功能中要求退出。为了做到这一点,我需要将exitRequested 标志传递给这些函数,但在我看来这看起来不太好,可能有更好的解决方案。
我能想到的一个解决方案是通过抛出异常来创建这样的东西:
void threadfunction()
{
try {
while(!exitRequested)
{
...
}
} catch (const ExitRequestException &e) {}
}
但是需要以某种方式引发异常。据我所知,我不能在另一个线程的线程中引发异常,对吧?
您有更好的解决方案吗?还是您认为我真的需要将exitRequested 标志传递给所有这些函数并污染我的代码?
【问题讨论】:
-
您可以将一个引用(可能通过
shared_ptr)传递给其构造函数中的每个不同工作对象的退出标志。 -
将 exitRequested 标志(通过引用!)传递给函数。
-
@Jonathan 是的,你是对的,我也想过这个问题。但是,如果我这样做,我的代码再次污染,其中包含实际执行不需要的退出请求。我只是想知道是否有更好的解决方案。
-
只需将功能分解为检查点/块/阶段或任何你称之为的东西。
标签: c++ multithreading kill terminate