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
时,必须注意线程安全和异常处理的问题。