std::thread 的构造-源码解析

std::thread 的构造-源码解析

我们这单章是为了专门解释一下 std::thread 是如何构造的,是如何创建线程传递参数的,让你彻底了解这个类。

我们以 MSVC 实现的 std::thread 代码进行讲解。

std::thread 的数据成员

  • 了解一个庞大的类,最简单的方式就是先看它的数据成员有什么

std::thread 只保有一个私有数据成员 _Thr

private:
    _Thrd_t _Thr;

_Thrd_t 是一个结构体,它保有两个数据成员:

using _Thrd_id_t = unsigned int;
struct _Thrd_t {
   
    // thread identifier for Win32
    void* _Hnd; // Win32 HANDLE
    _Thrd_id_t _Id;
};

结构很明确,这个结构体的 _Hnd 成员是指向线程的句柄,_Id 成员就是保有线程的 ID。

在64 位操作系统,因为内存对齐,指针 8 ,无符号 int 4,这个结构体 _Thrd_t 就是占据 16 个字节。也就是说 sizeof(std::thread) 的结果应该为 16

std::thread 的构造函数

std::thread 有四个构造函数,分别是:

  1. 默认构造函数,构造不关联线程的新 std::thread 对象。

    thread() noexcept : _Thr{
         
         } {
         
         }
    

    值初始化了数据成员 _Thr ,这里的效果相当于给其成员 _Hnd_Id 都进行零初始化

  2. 移动构造函数,转移线程的所有权,构造 other 关联的执行线程的 std::thread 对象。此调用后 other 不再表示执行线程失去了线程的所有权。

    thread(thread&& _Other) noexcept : _Thr(_STD exchange(_Other._Thr, {
         
         })) {
         
         }
    

    _STD 是一个宏,展开就是 ::std::,也就是 ::std::exchange,将 _Other._Thr 赋为 {} (也就是置空),返回 _Other._Thr 的旧值用以初始化当前对象的数据成员 _Thr

  3. 复制构造函数被定义为弃置的,std::thread 不可复制。两个 std::thread 不可表示一个线程,std::thread 对线程资源是独占所有权。

    thread
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值