侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

C++ 标准库 thread

barwe
2022-09-05 / 0 评论 / 0 点赞 / 1,349 阅读 / 1,394 字
温馨提示:
本文最后更新于 2022-09-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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()

获取当前系统支持的线程并发数目,仅作为系统提示使用。

0

评论区