C++ 11之后实现了标准线程库 thread:
#include <thread>
标准库提供的主要内容有:
- namespace
this_thread
: 提供访问当前线程执行实例的函数 - class
thread
: 管理单个线程 - class
jthread
: 添加了自动 join 和 cancel 的 thread 类
namespace this_thread
线程的 ID:
std::this_thread::get_id()
暂时放弃线程的执行,由操作系统调度先执行另一线程:
std::this_thread::yield()
使线程休眠到 指定时刻:
template<class Clock, class Duration>
void sleep_until(const std::chrono::time_point<Clock, Duration>& sleep_time);
至少休眠指定时间长度:
std::chrono::seconds duration(5);
std::this_thread::sleep_for(duration);
class thread
constructor
初始化构造函数:指定一个函数作为任务,初始化一个线程对象。
template <class Fn, class... Args>
explicit std::thread(Fn&& fn, Args&&... args);
默认构造函数:线程对象不能被 join,一般不太用的上。
拷贝构造函数:禁用,线程对象不能被拷贝,不用能两个线程对象来表示同一个线程。
Move 构造函数:将一个线程对象从一个引用变量移动到另一个变量,移动后原引用变量不可用。
构造线程对象一般使用简写形式:
std::thread t(some_fn, ...);
instance methods
get_id()
返回值类型是std::thread::id
:
std::thread t(some_fn);
std::thread::id t_id = t.get_id();
joinable()
线程是否可以被 join,只有活动的执行线程才能被 join。由默认构造函数创建的就是一个空线程对象,它不能被 join。
线程是否是活动的与它执行的具体任务没有关系,所以即时任务执行完了,它仍然可以被 join。
detach()
将线程的 执行实例 与 线程对象 分离,使得线程的任务可以单独执行。
一旦执行完毕,该任务占用的对应资源将会被自动释放,其状态不会被更新到线程对象上。
执行分离后:
- 线程对象的
this
不再绑定执行实例,所以查询不到与任务执行相关的所有信息 joinable()
始终返回false
,因为分离后线程对象就是个空壳子get_id()
始终返回std::thread::id()
目前不知道这个方法有啥用。
swap(...)
交换两个线程对象的底层句柄,互换两个线程对象的执行实例。
std::thread t1(foo);
std::thread t2(bar);
t1.swap(t2);
std::swap(t1, t2);
native_handle()
获取线程对象底层的原生句柄,这个句柄与操作系统有关系,不同的操作系统实现线程依赖的底层库可能不同。
class methods
hardware_concurrency()
获取当前系统支持的线程并发数目,仅作为系统提示使用。
评论区