【C++】std::thread 标准库线程的基本使用

在C++中,std::thread 类是C++11引入的标准库组件,用于创建和管理线程。

1. 头文件

首先,需要包含 #<thread> 头文件来使用 std::thread。

#include <iostream>
#include <thread>

2. 定义函数

定义线程执行的函数或可调用对象,可以定义一个普通函数、lambda表达式、函数对象或成员函数作为线程执行的任务

void threadFunction(int id) {
    std::cout << "Thread " << id << " is running." << std::endl;
}

3. 创建线程

使用 std::thread 构造函数创建线程实例,传入要执行的函数和相应的参数。

std::thread myThread(threadFunction, 1);

4. 启动线程

  • Join: 使用 join() 方法等待线程结束。调用 join() 后,主线程会阻塞,直到该子线程完成。
  • Detach: 使用 detach() 方法使线程独立运行,不再与创建它的线程关联。一旦线程被分离,就不能再 join() 它,它会在后台独立运行直到完成。

线程状态

  • joinable() 方法用来检查线程是否可以被 join()。如果线程已经被 join() 过或者被 detach() 过,那么它就不是 joinable 的。
// join
if (myThread.joinable()) {
    myThread.join();
}

// detach
if (myThread.joinable()) {
    myThread.detach();
}

5. 示例

std::thread 的例子

#include <iostream>
#include <thread>

void printHello(int times) {
    for (int i = 0; i < times; ++i) {
        std::cout << "Hello from thread! " << i << std::endl;
    }
}

int main() {
    std::thread myThread(printHello, 5);

    std::cout << "Main thread doing something else..." << std::endl;

    // 等待线程结束
    if (myThread.joinable()) {
        myThread.join();
    }

    std::cout << "All threads done." << std::endl;

    return 0;
}

6. 注意事项

  • 确保在销毁 std::thread 对象之前,要么调用了 join(),要么调用了 detach(),否则会引发未定义行为。
  • 在多线程编程中,还需要考虑线程同步问题,比如使用互斥锁 (std::mutex)、条件变量 (std::condition_variable) 等来避免数据竞争和不一致问题。