C++11中的std::thread类概览
在C++11标准库中,std::thread类是一个强大的工具,它允许我们轻松创建和管理线程。线程是并行执行的基本单位,通过使用std::thread,我们可以使程序同时执行多个任务,从而提高程序的运行效率。
std::thread的使用注意事项
当我们使用std::thread时,需要注意传递给它的参数必须是可调用的。这是因为从C++11开始,rvalue可以直接作为函数参数和返回值。这不仅简化了代码,还提高了效率。
一个简单的例子说明:
假设我们有一个名为print_hello的函数,它不接受任何参数并打印一条消息。我们可以使用std::thread来创建一个新线程并执行这个函数。
```cpp
include
include
void print_hello() {
std::cout << "Hello from thread!" << std::endl;
}
int main() {
// 将函数及其参数移至前端(在C++中,这种写法称为完美转发)
auto&& arg = print_hello; // 这里arg是一个函数对象,而不是一个值或引用
std::thread t(arg); // 创建线程并执行函数arg对应的任务
t.join(); // 等待线程完成执行(确保主线程不会提前结束)
return 0;
}
```
在这个例子中,我们直接将print_hello函数作为参数传递给std::thread构造函数。值得注意的是,这里的arg是一个函数对象,它包含了函数的调用信息,而不是函数的实际参数。std::thread构造函数需要一个可调用的对象来知道在新线程中应该执行什么任务。为了确保主线程不会在线程任务完成之前结束,我们使用t.join()来等待新线程完成执行。这样,我们就可以确保程序的正确性和稳定性。在编译时,编译器会检查arg是否可以被转换为void指针类型,因为std::thread构造函数需要一个void指针类型的参数来保存线程ID信息。如果arg不能被转换为void指针类型,编译器会报错。在使用std::thread时,我们需要确保传递的参数是有效的并且可以被调用。如果我们需要传递参数给线程函数,我们可以使用std::bind或者lambda表达式来实现。 |