没有参数的std :: thread构造函数

詹姆士

根据cppreference.comstd::thread没有参数构造函数意味着:

创建不代表线程的新线程对象。

我的问题是:

  1. 为什么我们需要这个构造函数?如果我们thread使用此构造函数创建一个,我们以后如何“分配”一个线程函数?
  2. 为什么我们没有“ run(function_address)”方法,以便在不带参数构造时可以为该函数指定要“运行”的函数thread
  3. 或者,我们可以构造一个thread带有可调用参数(函数,函子等)的,但是调用“ run()”方法以稍后实际执行线程。为什么std::thread不以这种方式设计?
乔纳森·韦克利

您的问题表明可能存在一些混淆,将执行线程的思想std::thread类型明确分开,以及将执行线程的思想与“线程功能”思想分开将很有帮助

  • 一个执行线程表示通过程序的控制流程,大概相当于由内核管理的OS线程。
  • 类型的对象std::thread可以与执行线程相关联,也可以是“空”并且不引用任何执行线程
  • 在标准C ++中没有“线程函数”这样的概念。通过将任何函数传递给对象的构造函数,都可以在新的执行线程中运行该函数std::thread
  1. 为什么我们需要这个构造函数?

构造不涉及执行线程的空状态您可能希望拥有一个类的成员变量std::thread,而不是立即将其与执行线程相关联因此,您默认构造它,然后在以后启动新的执行线程并将其与std::thread成员变量关联或者您可能想做:

std::thread t;
if (some_condition) {
  t = std::thread{ func1, arg1 };
}
else {
  auto result = some_calculation();
  t = std::thread{ func2, arg2, result };
}

默认构造函数允许t创建对象直到需要时才启动新的执行线程

而且,如果我们使用此构造函数创建线程,那么以后如何“分配”线程函数?

您使用“分配”进行“分配” :-)

但是,您没有为其分配“线程功能”,这不是std::thread目的。您为其分配另一个std::thread

std::thread t;
std::thread t2{ func, args };
t = std::move(t2);

创建新的执行线程而不是“分配线程功能”的角度考虑。您不只是分配一个功能,这就是std::function要使用的功能。您正在请求运行时创建一个新的执行线程,该线程将由一个std::thread对象管理

  1. 为什么我们没有“ run(function_address)”方法,以便在不带参数构造时可以为该线程指定要“运行”的函数。

因为您不需要它。您可以通过构造std::thread带有参数对象来启动新的执行线程如果您希望该执行线程与现有对象相关联,则可以通过移动分配或交换来实现。

  1. 或者,我们可以构造一个具有可调用参数(函数,函子等)的线程,但调用“ run()”方法在以后实际执行该线程。为什么std :: thread不是这样设计的?

为什么要这样设计?

std::thread类型用于管理不保存可调用对象以供以后使用的执行线程如果你想创建一个可以在新的以后运行一个可调用对象执行的线程有很多方法可以做到,在C ++(使用lambda表达式,或者std::bind,或者std::function,或者std::packaged_task,或者自定义的仿函数类型)。的工作std::thread是管理一个执行线程,直到您要调用它为止,它都不要保留可调用对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: thread ---没有匹配的构造函数

来自分类Dev

C ++ 11多线程合并排序,错误为“没有构造函数'std :: thread'的实例与参数列表匹配”

来自分类Dev

在没有复制构造函数的对象的成员函数中启动 std::thread

来自分类Dev

std :: thread构造函数(变量数量)

来自分类Dev

没有匹配的构造函数,用于初始化'std :: thread'

来自分类Dev

vscode中的C ++:错误:没有匹配的构造函数来初始化'std :: thread'

来自分类Dev

没有合适的构造函数可以从void转换为std:thread

来自分类Dev

'std :: thread :: thread':没有重载函数需要7个参数

来自分类Dev

ViewModel没有零参数构造函数

来自分类Dev

(Java入门):构造函数没有参数?

来自分类Dev

....没有定义无参数构造函数?

来自分类Dev

创建没有复制构造函数的std :: vectors的std :: vector

来自分类Dev

std :: thread构造函数如何检测右值引用?

来自分类Dev

std :: thread通过引用传递调用复制构造函数

来自分类Dev

无法捕获由std :: thread构造函数引发的异常

来自分类Dev

std :: thread通过引用传递调用复制构造函数

来自分类Dev

'std :: thread'如何确定传递给构造函数的可变参数的数量

来自分类Dev

为什么std :: exception没有移动构造函数?

来自分类Dev

没有参数的构造函数不起作用

来自分类Dev

调用没有硬编码参数的构造函数(耦合)

来自分类Dev

= default和没有参数的空构造函数之间的区别?

来自分类Dev

错误:没有构造函数的实例与参数列表匹配

来自分类Dev

如何检查没有参数的类的构造函数

来自分类Dev

没有在类中定义3个参数的构造函数?

来自分类Dev

没有参数的构造函数给我错误

来自分类Dev

命中ViewModel没有零参数构造函数

来自分类Dev

没有参数名称的C ++构造函数

来自分类Dev

没有构造函数的实例与参数列表匹配

来自分类Dev

MVC:此对象没有无参数构造函数

Related 相关文章

  1. 1

    std :: thread ---没有匹配的构造函数

  2. 2

    C ++ 11多线程合并排序,错误为“没有构造函数'std :: thread'的实例与参数列表匹配”

  3. 3

    在没有复制构造函数的对象的成员函数中启动 std::thread

  4. 4

    std :: thread构造函数(变量数量)

  5. 5

    没有匹配的构造函数,用于初始化'std :: thread'

  6. 6

    vscode中的C ++:错误:没有匹配的构造函数来初始化'std :: thread'

  7. 7

    没有合适的构造函数可以从void转换为std:thread

  8. 8

    'std :: thread :: thread':没有重载函数需要7个参数

  9. 9

    ViewModel没有零参数构造函数

  10. 10

    (Java入门):构造函数没有参数?

  11. 11

    ....没有定义无参数构造函数?

  12. 12

    创建没有复制构造函数的std :: vectors的std :: vector

  13. 13

    std :: thread构造函数如何检测右值引用?

  14. 14

    std :: thread通过引用传递调用复制构造函数

  15. 15

    无法捕获由std :: thread构造函数引发的异常

  16. 16

    std :: thread通过引用传递调用复制构造函数

  17. 17

    'std :: thread'如何确定传递给构造函数的可变参数的数量

  18. 18

    为什么std :: exception没有移动构造函数?

  19. 19

    没有参数的构造函数不起作用

  20. 20

    调用没有硬编码参数的构造函数(耦合)

  21. 21

    = default和没有参数的空构造函数之间的区别?

  22. 22

    错误:没有构造函数的实例与参数列表匹配

  23. 23

    如何检查没有参数的类的构造函数

  24. 24

    没有在类中定义3个参数的构造函数?

  25. 25

    没有参数的构造函数给我错误

  26. 26

    命中ViewModel没有零参数构造函数

  27. 27

    没有参数名称的C ++构造函数

  28. 28

    没有构造函数的实例与参数列表匹配

  29. 29

    MVC:此对象没有无参数构造函数

热门标签

归档