【C++】多线程编程二(std::thread详解)
发布人:shili8
发布时间:2024-12-31 18:14
阅读次数:0
**多线程编程二:std::thread详解**
在前一篇文章中,我们已经了解了多线程编程的基本概念和使用`std::thread`类来创建线程。然而,`std::thread`类还有很多其他功能和特性值得我们去探索。在本文中,我们将深入地讨论`std::thread`类的详细信息。
### std::thread类概述`std::thread`类是C++11引入的一个用于创建线程的类。它提供了一个简单而高效的方式来管理线程的生命周期,包括启动、停止和等待线程的完成。
### 构造函数`std::thread`类有两个构造函数:
cppexplicit thread() noexcept; templateexplicit thread(F&& f);
第一个构造函数是默认构造函数,它什么也不做。第二个构造函数接受一个可调用对象(Callable Object)作为参数,这个可调用对象将被执行在新创建的线程中。
### 启动线程要启动一个线程,我们需要使用`join()`或`detach()`成员函数之一:
cppvoid join(); void detach();
`join()`函数会阻塞当前线程直到目标线程完成。`detach()`函数则会分离目标线程,使其成为独立的线程,不再受当前线程控制。
### 等待线程如果我们使用`join()`函数启动一个线程,那么就可以使用`join()`函数等待该线程的完成:
cppvoid join();
但是,如果我们使用`detach()`函数启动一个线程,那么就不能再使用`join()`函数来等待其完成。相反,我们需要使用`std::thread::id`成员变量来检查线程是否已经完成:
cppbool operator==(const id& other) const noexcept;
### 线程ID每个线程都有一个唯一的ID,可以通过`std::thread::id`类型来获取:
cpptypedef std::thread::id thread_id_type;
我们可以使用`operator==()`函数来比较两个线程ID是否相同。
### 示例代码下面是一个示例代码,演示了如何使用`std::thread`类创建和管理多个线程:
cpp#include <iostream> #include <thread> void printHello() { std::cout << "Hello from thread!" << std::endl; } int main() { // 创建一个新线程,执行printHello函数 std::thread t1(printHello); // 等待t1线程完成 t1.join(); return0; }
在这个示例中,我们创建了一个名为`t1`的线程,它执行`printHello()`函数。然后我们使用`join()`函数等待`t1`线程完成。
### 总结在本文中,我们深入地讨论了`std::thread`类的详细信息,包括构造函数、启动线程、等待线程和线程ID。通过这些知识,我们可以更好地使用`std::thread`类来管理多线程程序的生命周期。
### 参考资料* 《C++ Primer》第五版* 《Effective C++》第二版* 《The C++ Programming Language》第四版