MST

星途 面试题库

面试题:C++ 多线程创建的常见方式及区别

在C++ 中,有哪些常见的方式可以创建多线程?请详细描述每种方式的特点以及它们之间的主要区别,例如使用 std::thread 库和 pthread 库创建线程的不同之处。
16.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 使用 std::thread 库创建线程

  • 特点
    • 跨平台性:是 C++ 标准库的一部分,具有良好的跨平台性,只要编译器支持 C++ 11 及以上标准,在不同操作系统(如 Windows、Linux、MacOS 等)上都能使用相同的代码创建线程,无需针对不同平台做过多调整。
    • 面向对象风格:基于对象的方式来管理线程,通过 std::thread 类对象来表示一个线程,使用起来较为直观和方便,符合 C++ 的编程习惯。例如,std::thread 类提供了多种成员函数,如 join() 用于等待线程结束,detach() 用于分离线程等。
    • 资源管理自动:与 C++ 的资源管理方式(RAII)相结合,当 std::thread 对象销毁时,如果线程还在运行,会自动调用 std::terminate() 来终止线程,避免了资源泄漏。
  • 示例代码
#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "This is a thread." << std::endl;
}

int main() {
    std::thread myThread(threadFunction);
    myThread.join();
    return 0;
}

2. 使用 pthread 库创建线程(主要用于 Unix - like 系统,如 Linux、MacOS 等)

  • 特点
    • 底层性:是 POSIX(可移植操作系统接口)标准定义的线程库,提供了较为底层的线程操作接口,对线程的控制更为精细,适合对性能和资源管理要求较高的场景。
    • 灵活性:可以直接操作线程的属性,如线程的优先级、栈大小等,这在一些特定需求的场景下非常有用。例如,可以通过 pthread_attr_t 结构体来设置线程的各种属性。
    • 平台局限性:主要用于 Unix - like 系统,在 Windows 系统上不能直接使用,若要在 Windows 下使用需要借助一些工具(如 MinGW 等)进行模拟,所以跨平台性不如 std::thread
  • 示例代码
#include <iostream>
#include <pthread.h>

void* threadFunction(void* arg) {
    std::cout << "This is a pthread." << std::endl;
    return nullptr;
}

int main() {
    pthread_t myThread;
    pthread_create(&myThread, nullptr, threadFunction, nullptr);
    pthread_join(myThread, nullptr);
    return 0;
}

3. 两者主要区别

  • 跨平台性std::thread 具有更好的跨平台性,能在多种操作系统上使用;而 pthread 主要用于 Unix - like 系统。
  • 编程风格std::thread 采用面向对象风格,更符合 C++ 编程习惯;pthread 是基于函数调用的风格,相对较为底层和传统。
  • 资源管理std::thread 利用 RAII 机制自动管理资源,减少了资源泄漏风险;pthread 需要手动管理线程资源,如在适当的地方调用 pthread_join()pthread_detach() 来避免资源问题。
  • 功能特性pthread 提供了更底层和精细的线程控制功能,如线程属性的详细设置;而 std::thread 提供了相对简洁、通用的线程操作接口,满足大多数常见场景需求。