根据cppreference.com,std::thread
没有参数的构造函数意味着:
创建不代表线程的新线程对象。
我的问题是:
thread
使用此构造函数创建一个,我们以后如何“分配”一个线程函数?thread
。thread
带有可调用参数(函数,函子等)的,但是调用“ run()”方法以稍后实际执行线程。为什么std::thread
不以这种方式设计?您的问题表明可能存在一些混淆,将执行线程的思想与std::thread
类型明确分开,以及将执行线程的思想与“线程功能”思想分开将很有帮助。
std::thread
可以与执行线程相关联,也可以是“空”并且不引用任何执行线程。std::thread
。
- 为什么我们需要这个构造函数?
构造不涉及执行线程的空状态。您可能希望拥有一个类的成员变量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
对象管理。
- 为什么我们没有“ run(function_address)”方法,以便在不带参数构造时可以为该线程指定要“运行”的函数。
因为您不需要它。您可以通过构造std::thread
带有参数的对象来启动新的执行线程。如果您希望该执行线程与现有对象相关联,则可以通过移动分配或交换来实现。
- 或者,我们可以构造一个具有可调用参数(函数,函子等)的线程,但调用“ run()”方法在以后实际执行该线程。为什么std :: thread不是这样设计的?
为什么要这样设计?
该std::thread
类型用于管理不保存可调用对象以供以后使用的执行线程。如果你想创建一个可以在新的以后运行一个可调用对象执行的线程有很多方法可以做到,在C ++(使用lambda表达式,或者std::bind
,或者std::function
,或者std::packaged_task
,或者自定义的仿函数类型)。的工作std::thread
是管理一个执行线程,直到您要调用它为止,它都不要保留可调用对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句