C++ 标准提供的 thread (线程)之 join() 函数示例(windows平台)

thread join() 成员函数会告诉当前线程在这个线程执行完成之前不要继续执行,即在当前线程阻塞,直到这个线程执行完成,join() 本质上就是一个等待事件。例如:

#include <atomic>

#include <thread>

#include <chrono>

using namespace std::chrono;

void tick(int n)

{

    for (int i = 0; i != n; ++i) {

        this_thread::sleep_for(seconds{ 1 });

        cout<<"Alive!"<<endl;

    }

}

int _tmain(int argc, _TCHAR* argv[])

{

    thread timer{ tick,10 };

    timer.join();   //阻塞直到 timer 线程完成

    system("pause");

    return 0;

}

join() 实现代码(windows平台):

void join() {

    if (!joinable()) {

        _Throw_Cpp_error(_INVALID_ARGUMENT);

    }

    if (_Thr._Id == _Thrd_id()) {

        _Throw_Cpp_error(_RESOURCE_DEADLOCK_WOULD_OCCUR);

    }

    if (_Thrd_join(_Thr, nullptr) != _Thrd_success) {

        _Throw_Cpp_error(_NO_SUCH_PROCESS);

    }

    _Thr = {};

}

函数 _Thrd_join():

---cthread.cpp ------------------
00007FF7459BDC60  mov         qword ptr [rsp+10h],rdx  
00007FF7459BDC65  mov         qword ptr [rsp+8],rcx  
00007FF7459BDC6A  sub         rsp,38h  
00007FF7459BDC6E  xor         r8d,r8d  
00007FF7459BDC71  mov         edx,0FFFFFFFFh  
00007FF7459BDC76  mov         rax,qword ptr [&thr]  
00007FF7459BDC7B  mov         rcx,qword ptr [rax]  

00007FF7459BDC7E  call        qword ptr [__imp_WaitForSingleObjectEx (07FF745B9A090h)]  
00007FF7459BDC84  cmp         eax,0FFFFFFFFh  
00007FF7459BDC87  jne         _Thrd_join+30h (07FF7459BDC90h)  
00007FF7459BDC89  mov         eax,4  
00007FF7459BDC8E  jmp         _Thrd_join+89h (07FF7459BDCE9h)  
00007FF7459BDC90  cmp         qword ptr [code],0  
00007FF7459BDC96  je          _Thrd_join+61h (07FF7459BDCC1h)  
00007FF7459BDC98  lea         rdx,[rsp+24h]  
00007FF7459BDC9D  mov         rax,qword ptr [&thr]  
00007FF7459BDCA2  mov         rcx,qword ptr [rax]  

00007FF7459BDCA5  call        qword ptr [__imp_GetExitCodeThread (07FF745B9A0A8h)]  
00007FF7459BDCAB  test        eax,eax  
00007FF7459BDCAD  jne         _Thrd_join+56h (07FF7459BDCB6h)  
00007FF7459BDCAF  mov         eax,4  
00007FF7459BDCB4  jmp         _Thrd_join+89h (07FF7459BDCE9h)  
00007FF7459BDCB6  mov         rax,qword ptr [code]  
00007FF7459BDCBB  mov         ecx,dword ptr [rsp+24h]  
00007FF7459BDCBF  mov         dword ptr [rax],ecx  
00007FF7459BDCC1  mov         rax,qword ptr [&thr]  
00007FF7459BDCC6  mov         rcx,qword ptr [rax]  

00007FF7459BDCC9  call        qword ptr [__imp_CloseHandle (07FF745B9A088h)]  
00007FF7459BDCCF  test        eax,eax  
00007FF7459BDCD1  je          _Thrd_join+7Dh (07FF7459BDCDDh)  
00007FF7459BDCD3  mov         dword ptr [rsp+20h],0  
00007FF7459BDCDB  jmp         _Thrd_join+85h (07FF7459BDCE5h)  
00007FF7459BDCDD  mov         dword ptr [rsp+20h],4  
00007FF7459BDCE5  mov         eax,dword ptr [rsp+20h]  
00007FF7459BDCE9  add         rsp,38h  
00007FF7459BDCED  ret 

可以看出,实际上函数接收一个线程句柄,调用函数 WaitForSingleObjectEx  等待线程完成,然后释放线程句柄。

而线程在完成初始化后,直接启动一个新线程:

thread timer{ tick,10 } 内部调用 _beginthreadex 启动一个新的线程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值