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
提供了相对简洁、通用的线程操作接口,满足大多数常见场景需求。