您的位置:

std::thread用法详解

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结束。