std::thread是C++11标准库中的一个多线程库,提供了一种跨多个CPU核心并发执行代码的方法。它具有简单、灵活和高吞吐量等优点,使得它成为编写多线程代码的首选工具。在本篇文章中,我们将从以下方面详细介绍std::thread的用法:
一、创建线程
要创建一个线程,只需使用std::thread的构造函数即可。std::thread的构造函数接受一个可调用对象,并将其作为新线程中运行的函数。以下是std::thread构造函数的示例:
#include#include void PrintHello() { std::cout << "Hello World!\n"; } int main() { // 创建线程并启动 std::thread t(PrintHello); // 等待线程结束 t.join(); return 0; }
在上面的示例中,我们创建了一个名为t的线程,并将PrintHello函数作为可调用对象传递给std::thread构造函数。线程t启动后,将运行PrintHello函数的代码。在main函数的最后,我们等待线程t结束,然后退出程序。
二、传递参数
如果需要向线程传递参数,可以使用std::thread构造函数的参数列表,将参数传递给可调用对象。以下是std::thread传递参数的示例:
#include#include void PrintHello(std::string name) { std::cout << "Hello " << name << "!\n"; } int main() { // 创建线程并启动 std::thread t(PrintHello, "Alice"); // 等待线程结束 t.join(); return 0; }
在上面的示例中,我们将一个字符串”Alice”作为参数传递给PrintHello函数,该参数被封装在std::thread构造函数中。线程t启动后,将运行PrintHello函数的代码。在main函数的最后,我们等待线程t结束,然后退出程序。
三、获取线程id
每个线程都有一个唯一的id,可以使用std::thread的成员函数get_id()获取线程id。以下是std::thread获取线程id的示例:
#include#include void PrintThreadId() { std::cout << "Thread ID: " << std::this_thread::get_id() << "\n"; } int main() { // 创建线程并启动 std::thread t(PrintThreadId); // 等待线程结束 t.join(); return 0; }
在上面的示例中,我们定义了一个PrintThreadId函数,它将输出当前线程的id。在main函数中,我们创建了一个名为t的线程,启动了PrintThreadId函数。在PrintThreadId函数中,std::this_thread::get_id()函数返回当前线程的id,并将其输出到控制台上。
四、线程休眠
有时候需要让线程休眠一段时间,这可以使用std::this_thread::sleep_for()函数实现。该函数接受一个std::chrono::duration类型的参数,指定线程休眠的时间。以下是std::thread休眠的示例:
#include#include #include void PrintHello() { std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "Hello World!\n"; } int main() { // 创建线程并启动 std::thread t(PrintHello); // 等待线程结束 t.join(); return 0; }
在上面的示例中,我们定义了一个PrintHello函数,并在函数中休眠了1秒钟。在main函数中,我们创建了一个名为t的线程,启动了PrintHello函数,该函数在休眠后将输出“Hello World!”。
五、线程分离
在std::thread中,线程分离是指主线程和子线程在执行时互不干扰,它们相互独立。如果创建的线程没有被分离,那么在main函数中需要使用t.join()等待线程结束后才能退出程序,否则程序会崩溃。为了避免这种情况,可以使用std::thread的成员函数detach()将线程分离。以下是std::thread线程分离的示例:
#include#include void PrintHello() { std::cout << "Hello World!\n"; } int main() { // 创建线程并启动 std::thread t(PrintHello); // 分离线程 t.detach(); return 0; }
在上面的示例中,我们定义了一个PrintHello函数,并在main函数中创建了一个名为t的线程。在主线程中,我们使用t.detach()将线程t分离,使其独立运行。在PrintHello函数中,它输出了“Hello World!”,然后线程t结束。