jam*_*mes 4 c++ multithreading c++11 stdthread
根据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 };
}
Run Code Online (Sandbox Code Playgroud)
默认构造函数允许t在不需要启动新的执行线程的情况下创建对象.
如果我们使用这个构造函数创建一个线程,我们如何在以后"分配"一个线程函数?
你使用"作业""分配":-)
但是你没有给它分配一个"线程函数",这不是std::thread为了什么.您为其分配另一个std::thread:
std::thread t;
std::thread t2{ func, args };
t = std::move(t2);
Run Code Online (Sandbox Code Playgroud)
考虑创建一个新的执行线程而不是"为某个东西分配一个线程函数".你不只是分配一个函数,那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是管理一个执行线程,不要保留一个可调用对象,直到你想要调用它.
| 归档时间: |
|
| 查看次数: |
3512 次 |
| 最近记录: |