std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
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::thread::d etach。
它将实际的执行线程和std::thread
对象分离,允许您在不加入线程的情况下销毁它。
您可以使用std::async
.
异步异步运行函数 f(可能在可能是线程池一部分的单独线程中(并返回最终将保存该函数调用结果的 std::future。
既然你没有提到你需要得到线程的结果,所以没有必要得到未来。
正如注释中指出的,std::future 的析构函数在任何情况下都会阻塞,因此您必须将其移动到某个全局对象(并手动管理未使用的期货的删除(,或者您可以将其移动到异步调用函数的本地范围内。
另一个首选选项是允许线程使用任务队列中的任务。为此,将作业拆分为任务 chuck 并馈送到工作线程。为避免轮询,请选择condition_variable。
std::thread([&](){
while(running) // thread loop
{
// consume tasks from queue
}
}).detach();
相关文章:
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 是否未定义将对函数范围变量的引用作为值返回
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 在函数范围之外的标头中使用 UDL
- 模板化函数范围内的条件模板化类型别名
- 获取提升程序选项以在函数范围之后保留
- C++ 链表 - 插入节点函数不会更新函数范围之外的值
- C++:将参数应用于函数范围
- 为什么基于指针交换两个值在函数范围之外不起作用?
- 类模板中定义的朋友函数范围定义的范围是什么?
- 在内联程序集中使用函数范围的标签
- 检测函数范围之外的未使用变量
- 静态变量生存期、文件范围与函数范围
- 是否可以编写一个在函数范围内使用时会抱怨的宏
- Arduino-setup()中声明的变量不在函数范围内
- C++-函数范围内的函数声明
- 我是否要删除函数范围内的内存?