介绍一下std::thread

发布于:2024-05-07 ⋅ 阅读:(23) ⋅ 点赞:(0)

std::thread 是 C++11 标准库中的一个类,它用于表示和控制线程的执行。通过 std::thread,你可以创建和管理多个并发执行的线程,这些线程可以共享应用程序的资源,并执行不同的任务。

创建线程

std::thread 的构造函数用于创建线程。最常见的用法是传入一个可调用的对象(如函数、函数对象、Lambda 表达式等)作为线程的入口点。例如:

#include <iostream>
#include <thread>
void print_hello() {
std::cout << "Hello from thread!\n";
}
int main() {
std::thread t(print_hello); // 创建一个新线程来执行 print_hello 函数
t.join(); // 等待线程 t 完成
return 0;
}

在这个例子中,std::thread t(print_hello); 创建了一个新的线程 t,该线程会执行 print_hello 函数。t.join(); 则会阻塞主线程,直到 t 线程执行完毕。

传递参数给线程函数

你可以通过 std::thread 的构造函数向线程函数传递参数。这些参数将按值传递给线程函数:

#include <iostream>
#include <thread>
void print_number(int num) {
std::cout << "Number: " << num << '\n';
}
int main() {
std::thread t(print_number, 42); // 传递整数 42 给 print_number 函数
t.join();
return 0;
}

线程ID和本地存储

每个 std::thread 对象都有一个唯一的线程ID,可以通过 std::thread::get_id 方法获取。另外,C++11 还引入了线程本地存储(Thread-Local Storage, TLS),允许你为每个线程存储不同的数据副本。

分离线程和等待线程

有两种方式可以处理线程结束时的情况:join 和 detach

  • join:调用线程(通常是主线程)会阻塞,直到被 join 的线程执行完毕。
  • detach:调用线程不会等待被 detach 的线程执行完毕。被 detach 的线程在其生命周期结束时会自动释放其资源。

线程安全

使用 std::thread 创建和管理线程时,必须注意线程安全。这通常意味着避免在多个线程之间共享可变数据,除非使用适当的同步机制(如互斥量、条件变量等)来保护这些数据。

异常处理

如果线程函数抛出一个异常且没有被捕获,那么 std::terminate 将会被调用,程序将会异常终止。因此,在线程函数中应该妥善处理所有可能的异常。

总结

std::thread 是 C++11 中用于创建和管理线程的类。它提供了简单的接口来启动新线程,并向线程函数传递参数。使用 std::thread 时,必须注意线程安全和异常处理的问题。