std::thread 这不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
std::thread that isn't a global variable but doesn't go out of scope when the end of the function that created it is reached?
所以我 运行 遇到了一些似乎违背 std::thread
目的或至少使它不那么方便的东西。
假设我想产生一个 std::thread
来执行一次任务并且之后不想再担心它。我在函数末尾附近创建了这个 thread
,因此 std::thread
很快就会超出范围,在我的例子中,很可能 thread
仍然是 运行。这会导致一些解决方案出现问题(或者至少我知道)。
我可以:
A) 使 std::thread
成为全局变量,这样它就不会超出范围。
B) 在 std::thread
上调用 join()
,这违背了生成线程的目的。
是否有其他更好的方法来处理这种情况?
您可以使用 std::async
.
async 异步运行函数 f(可能在一个单独的线程中,它可能是线程池的一部分)和 returns a std::future 最终将保存该函数的结果函数调用。
既然你没有提到需要获取线程的结果,那么就不需要获取future了。
正如评论中指出的那样,std::future 的析构函数在任何情况下都会阻塞,因此您必须将其移至某个全局对象(并手动管理未使用的期货的删除),或者您可以将其移动到异步调用函数的本地范围内。
你要的是std::thread::detach。
它将实际执行线程与 std::thread
对象分离,允许您在不加入线程的情况下销毁它。
其他首选选项是允许线程使用任务队列中的任务。为此,将作业拆分为任务块并提供给工作线程。为避免轮询,请选择 condition_variable.
std::thread([&](){
while(running) // thread loop
{
// consume tasks from queue
}
}).detach();
所以我 运行 遇到了一些似乎违背 std::thread
目的或至少使它不那么方便的东西。
假设我想产生一个 std::thread
来执行一次任务并且之后不想再担心它。我在函数末尾附近创建了这个 thread
,因此 std::thread
很快就会超出范围,在我的例子中,很可能 thread
仍然是 运行。这会导致一些解决方案出现问题(或者至少我知道)。
我可以:
A) 使 std::thread
成为全局变量,这样它就不会超出范围。
B) 在 std::thread
上调用 join()
,这违背了生成线程的目的。
是否有其他更好的方法来处理这种情况?
您可以使用 std::async
.
async 异步运行函数 f(可能在一个单独的线程中,它可能是线程池的一部分)和 returns a std::future 最终将保存该函数的结果函数调用。
既然你没有提到需要获取线程的结果,那么就不需要获取future了。
正如评论中指出的那样,std::future 的析构函数在任何情况下都会阻塞,因此您必须将其移至某个全局对象(并手动管理未使用的期货的删除),或者您可以将其移动到异步调用函数的本地范围内。
你要的是std::thread::detach。
它将实际执行线程与 std::thread
对象分离,允许您在不加入线程的情况下销毁它。
其他首选选项是允许线程使用任务队列中的任务。为此,将作业拆分为任务块并提供给工作线程。为避免轮询,请选择 condition_variable.
std::thread([&](){
while(running) // thread loop
{
// consume tasks from queue
}
}).detach();