C++多线程中的join, detach, joinable

thread是C++11中提供多线程编程的模块,使用的时候需要包含头文件。

首先我们先来看一下简单的hello world的多线程的代码(win10下vs2019)

这个创建的方式就是以函数作为一个入口,创建了一个子线程,那么创建的语句就是第11行代码所示,所传入的参数就是入口的函数名。在创建了这个子线程之后,这个子线程就开始运行了,同时主线程也不停的往下运行,当碰到t.join()这句代码的时候,就表示主线程需要等待子线程运行结束回收掉子线程的资源后,再往下运行,否则就会产生一种情况:当子线程还没有运行完主线程先运行完了,那么就会结束这个进程,从而中断了子线程的运行。因此join()函数的作用就是使主线程在此阻塞,等待子线程运行结束并回收其资源,再往下运行。

当然我们可以用this_thread::get_id()这个函数来验证这个子线程和主线程是不同的两个线程,结果如下图所示

可见两个线程的id是不同的。

然后我们再看一下下面的这个图,用的是detach函数:

从这个图中我们可以发现fun和main是交叉着输出的,并不是先输出fun中的内容,那么detach的作用就是将主线程与子线程分离,主线程将不再等待子线程的运行,也就是说两个线程同时运行,当主线程结束的时候,进程结束。

那么可能就会产生一些疑问,那这样不就中断了子线程的运行吗?

其实不是,在detach的时候,这个子线程将脱离主线程的控制,子线程独立分离出去并在后台运行,相当于linux中的守护进程,那么该子线程会由运行时库托管。当主线程结束的时候,进程也就结束,那么该进程的所有线程也会结束,被分离出去的子线程会由运行时库回收其资源。

joinable()函数是一个布尔类型的函数,他会返回一个布尔值来表示当前的线程是否是可执行线程(能被join或者detach),因为相同的线程不能join两次,也不能join完再detach,同理也不能detach,所以joinable函数就是用来判断当前这个线程是否可以joinable的。通常不能被joinable有以下几种情况:

1)由thread的缺省构造函数而造成的(thread()没有参数)。

2)该thread被move过(包括move构造和move赋值)。

3)该线程被join或者detach过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++使用多线程可以通过使用`<thread>`头文件的`std::thread`类来实现。以下是几个使用C++多线程的例子: 范例1: ```cpp #include <iostream> #include <thread> using namespace std; void myPrint() { cout << "我的线程开始运行" << endl; //... cout << "我的线程运行完毕" << endl; } int main() { thread myThread(myPrint); myThread.join(); cout << "Hello World!" << endl; system("pause"); return 0; } ``` 上述代码,我们使用`std::thread`类创建了一个线程对象`myThread`,并指定了线程执行的起点为`myPrint`函数。然后我们调用`myThread.join()`函数阻塞主线程,等待子线程完成执行,然后主线程继续执行。 范例2: ```cpp #include <iostream> #include <thread> using namespace std; class Ta { public: void operator()() { cout << "我的线程开始运行" << endl; //... cout << "我的线程运行完毕" << endl; } }; int main() { Ta ta; thread myThread(ta); myThread.join(); cout << "Hello World!" << endl; system("pause"); return 0; } ``` 上述代码,我们定义了一个类`Ta`,重载了`operator()`运算符,然后将对象`ta`传给`std::thread`类的构造函数创建了一个线程对象`myThread`,线程执行的起点为`ta`对象。然后我们调用`myThread.join()`函数阻塞主线程,等待子线程完成执行,然后主线程继续执行。 范例3: ```cpp #include <iostream> #include <thread> using namespace std; void myPrint() { cout << "我的线程开始运行" << endl; //... cout << "我的线程运行完毕" << endl; } int main() { thread myThread(myPrint); myThread.join(); if (myThread.joinable()) { cout << "可以调用join()或者detach()" << endl; } else { cout << "不能调用join()或者detach()" << endl; } cout << "Hello World!" << endl; system("pause"); return 0; } ``` 上述代码,我们创建了一个线程对象`myThread`,线程执行的起点是函数`myPrint`。然后我们调用`myThread.join()`函数阻塞主线程,等待子线程完成执行,然后主线程继续执行。在之后,我们使用`myThread.joinable()`函数来判断线程是否可以调用`join()`或者`detach()`函数。 以上是使用C++实现多线程的几个范例。希望对您有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Windows环境下的多线程编程(上)C++](https://blog.csdn.net/m0_56574701/article/details/124174550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值