pthread_join和pthread_detach的用法 【】转载】 C/C++:pthread_join()和pthread_detach()的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29621351/article/details/81948850

      简单来说:pthread_detach()和pthread_join()就是控制子线程回收资源的两种不同的方式。同一进程间的线程具有共享和独立的资源,其*享的资源有堆、全局变量、静态变量、文件等公用资源。而独享的资源有栈和寄存器,这两种方式就是决定子线程结束时如何回收独享的资源。

      pthread_detach()即主线程与子线程分离,两者相互不干涉,子线程结束同时子线程的资源自动回收。pthread_join()即是子线程合入主线程,主线程会一直阻塞,直到子线程执行结束,然后回收子线程资源,并继续执行。

代码编译过程为(文件取名main.cc)

  1. /** 编译 -lpthread为链接pthread**/
  2. g++ -o a.out main.cc -lpthread
  3. /** 执行 **/
  4. ./a.out

linux下内存占用查看指令为

  1. /** 先找到想要查看的程序的进程号 **/
  2. ps -ef
  3. /** -d 1 表示数据刷新频率1秒 -p xxx 表示想查看的程序的进程号 **/
  4. top -d 1 -p xxx

测试程序如下

  1. // for test
  2. #include <iostream>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. using namespace std;
  6. void* svc(void* args)
  7. {
  8. sleep(3);
  9. cout << "111111111111111" << endl;
  10. return nullptr;
  11. }
  12. int main()
  13. {
  14. do
  15. {
  16. pthread_t threadId = 0;
  17. const int ret = pthread_create(&threadId, 0, &svc, nullptr);
  18. if (ret == -1)
  19. {
  20. cout << "error while create thread!" << endl;
  21. return 0;
  22. }
  23. sleep(1)
  24. // pthread_join(threadId, nullptr);
  25. // cout << "222222222222222" << endl;
  26. // pthread_detach(threadId);
  27. // cout << "333333333333333" << endl;
  28. }while (false);
  29. getchar();
  30. return 0;
  31. }

 先注销掉pthread_join()和pthread_detach()两个函数,代码中每隔1s创建一个子线程,并且子线程在执行结束后资源并没有被释放,变成了僵尸线程,此时用top明明查看进程的内存占用,发现进程占用的内存不断增大。此时若取消注释pthread_join()或者是pthread_detach()中的任意一个,再重新编译并启动程序,发现进程内存占用不会增大。因为子线程资源被释放掉了(无论是子线程自动释放还是主线程回收,都是释放)。

然后在一个子线程中观察两种释放的区别(此时不再创建多个子线程)

  1. // for test
  2. #include <iostream>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. using namespace std;
  6. void* svc(void* args)
  7. {
  8. sleep(3);
  9. cout << "111111111111111" << endl;
  10. return nullptr;
  11. }
  12. int main()
  13. {
  14. do
  15. {
  16. pthread_t threadId = 0;
  17. const int ret = pthread_create(&threadId, 0, &svc, nullptr);
  18. if (ret == -1)
  19. {
  20. cout << "error while create thread!" << endl;
  21. return 0;
  22. }
  23. sleep(1)
  24. pthread_join(threadId, nullptr);
  25. cout << "222222222222222" << endl;
  26. // pthread_detach(threadId);
  27. // cout << "222222222222222" << endl;
  28. } while (false);
  29. // getchar();
  30. return 0;
  31. }

主线程调用pthread_join()时,主线程将阻塞在这条调用语句上,不再执行下面的cout,直到子线程执行完毕后,主线程回收了子线程的资源,才会继续向下执行。这段代码的测试结果是

pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别

先输出子线程休眠三秒后打印的111111111111111,后输出pthread_join()语句之后的222222222222222,这样我们发现,在子线程执行完毕之后,主线程才继续执行pthread_join()之后的语句。而如果我们使用pthread_detach(),代码如下

  1. // for test
  2. #include <iostream>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. using namespace std;
  6. void* svc(void* args)
  7. {
  8. sleep(3);
  9. cout << "111111111111111" << endl;
  10. return nullptr;
  11. }
  12. int main()
  13. {
  14. do
  15. {
  16. pthread_t threadId = 0;
  17. const int ret = pthread_create(&threadId, 0, &svc, nullptr);
  18. if (ret == -1)
  19. {
  20. cout << "error while create thread!" << endl;
  21. return 0;
  22. }
  23. sleep(1)
  24. // pthread_join(threadId, nullptr);
  25. // cout << "222222222222222" << endl;
  26. pthread_detach(threadId);
  27. cout << "222222222222222" << endl;
  28. } while (false);
  29. // getchar();
  30. return 0;
  31. }

结果如下

pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别

主线程不会等待子线程执行结束就已经执行结束了,因此子线程根本就没有来得及执行,程序就结束了。

我觉得这里可以理解为如果子线程的资源需要主线程来回收的话,那么主线程就一定要等子线程结束,因为子线程还没用完呢你就不能拿去回收,但是如果子线程资源要自动回收的话,那么主线程就不必等你了。

        <div class="hide-article-box hide-article-pos text-center">
        <a class="btn-readmore" data-report-view="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;,&quot;strategy&quot;:&quot;readmore&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;,&quot;strategy&quot;:&quot;readmore&quot;}">
            展开阅读全文
            <svg class="icon chevrondown" aria-hidden="true">
                <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-chevrondown"></use>
            </svg>
        </a>
    </div>
        <div >
pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
<div class="comment-edit-box d-flex">
	<a ></a>
	<div class="user-img">
		<a href="javascript:void(0);" target="_blank" rel="noopener">
			<img class="show_loginbox" src="//g.csdnimg.cn/static/user-img/anonymous-User-img.png">
		</a>
	</div>
	<form >
		<input type="hidden" >
		<textarea class="comment-content" name="comment_content" ></textarea>
		<div class="opt-box"> <!-- d-flex -->
			<div >
				<a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
			</div>
			<input type="hidden" >
			<input type="hidden" >
			<input type="hidden" >
			<input type="hidden" >
			<div style="display: none;" class="csdn-tracking-statistics tracking-click" data-report-click="{&quot;mod&quot;:&quot;popu_384&quot;,&quot;dest&quot;:&quot;&quot;}"><a href="#" target="_blank" class="comment_area_btn" rel="noopener">发表评论</a></div>
			<div class="dropdown" >
				<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
				<div class="txt-selected text-truncate">添加代码片</div>
				<svg class="icon d-block" aria-hidden="true">
					<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-triangledown"></use>
				</svg>
				</a>
				<ul class="dropdown-menu" >
					<li><a data-code="html">HTML/XML</a></li>
					<li><a data-code="objc">objective-c</a></li>
					<li><a data-code="ruby">Ruby</a></li>
					<li><a data-code="php">PHP</a></li>
					<li><a data-code="csharp">C</a></li>
					<li><a data-code="cpp">C++</a></li>
					<li><a data-code="javascript">JavaScript</a></li>
					<li><a data-code="python">Python</a></li>
					<li><a data-code="java">Java</a></li>
					<li><a data-code="css">CSS</a></li>
					<li><a data-code="sql">SQL</a></li>
					<li><a data-code="plain">其它</a></li>
				</ul>
			</div>  
			<div class="right-box">
				<span >还能输入<em>1000</em>个字符</span>
				<input type="button" class="btn btn-sm btn-cancel d-none" value="取消回复">
				<input type="submit" class="btn btn-sm btn-red btn-comment" value="发表评论">
			</div>
		</div>
	</form>
</div>

	<div class="comment-list-container">
	<a ></a>
	<div class="comment-list-box" style="display: none;">
	</div>
	<div ></div>
	
</div>
<div class="recommend-item-box recommend-ad-box"><div >
(function() {
    var s = "_" + Math.random().toString(36).slice(2);
    document.write('<div style="" ></div>');
    (window.slotbydup = window.slotbydup || []).push({
        id: "u3491668",
        container:  s
    });
})();

pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
<div class="recommend-item-box recommend-ad-box"><div ></div></div>
		<div class="recommend-item-box blog-expert-recommend-box" style="display: block;">
		<div class="d-flex">
			<div class="blog-expert-recommend">
				<div class="blog-expert">
					<div class="blog-expert-flexbox"><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/zhwenx3" target="_blank"><img src="https://avatar.csdn.net/2/B/B/3_zhwenx3.jpg" alt="swings_ss" title="swings_ss"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="zhwenx3" data-nick="swings_ss">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/zhwenx3" target="_blank"><h5 class="oneline" title="swings_ss">swings_ss</h5></a></span>  <p></p><p class="article-num" title="41篇文章"> 41篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/mantis_1984" target="_blank"><img src="https://avatar.csdn.net/9/F/E/3_mantis_1984.jpg" alt="炸鸡叔" title="炸鸡叔"><svg class="icon" aria-hidden="true"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-blogexpert"></use></svg></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="mantis_1984" data-nick="炸鸡叔">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/mantis_1984" target="_blank"><h5 class="oneline" title="炸鸡叔">炸鸡叔</h5></a></span>  <p></p><p class="article-num" title="216篇文章"> 216篇文章</p><p class="article-num" title="排名:9000+"> 排名:9000+</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/grantxx" target="_blank"><img src="https://avatar.csdn.net/8/F/1/3_grantxx.jpg" alt="grantxx" title="grantxx"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="grantxx" data-nick="grantxx">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/grantxx" target="_blank"><h5 class="oneline" title="grantxx">grantxx</h5></a></span>  <p></p><p class="article-num" title="84篇文章"> 84篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/weibo1230123" target="_blank"><img src="https://avatar.csdn.net/B/0/A/3_weibo1230123.jpg" alt="魏波-" title="魏波-"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="weibo1230123" data-nick="魏波-">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_29621351/article/details/81948850&quot;}"><a href="https://blog.csdn.net/weibo1230123" target="_blank"><h5 class="oneline" title="魏波-">魏波-</h5></a></span>  <p></p><p class="article-num" title="723篇文章"> 723篇文章</p><p class="article-num" title="排名:907"> 排名:907</p><p></p></div></div></div></div>
				</div>
			</div>
		</div>
	</div><div class="recommend-item-box baiduSearch" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/yzy1103203312/article/details/80850043&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;5&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/yzy1103203312/article/details/80850043&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:4,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/yzy1103203312/article/details/80850043&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:4,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/yzy1103203312/article/details/80850043" target="_blank">              		<h4 class="text-truncate oneline" style=" 872px;">多线程<em>pthread_join</em>()和<em>pthread_detach</em>()函数的比较 - ..._CSDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">11-7</span>                    </p>                  </div>                </a>            	</div><div class="recommend-item-box baiduSearch" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/jinchengzhou/article/details/48468639&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;6&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/jinchengzhou/article/details/48468639&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:5,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/jinchengzhou/article/details/48468639&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:5,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/jinchengzhou/article/details/48468639" target="_blank">              		<h4 class="text-truncate oneline" style=" 872px;"><em>pthread_join</em>和<em>pthread_detach</em>的<em>区别</em> - jinchengzhou的..._CSDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">7-31</span>                    </p>                  </div>                </a>            	</div>
<div class="recommend-item-box recommend-ad-box"><div >
<info-div class="wrap">
    <info-div class="singleImage-img singleImage-img-left">
        <info-div class="img" style="background-image:url(https://ilce.alicdn.com/montage/85771-37d33299c55b608723f48ddafff1d19e.jpg?channel=5&amp;content=%7B%227%22%3A%7B%22attrs%22%3A%7B%22value%22%3A%22https%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2F2019%2F500%2F144%2F11781441005_1186854740.summ.jpg%22%7D%7D%7D)"><info-div class="ads-tag"></info-div></info-div>
    </info-div>
    <info-div class="singleImage-body singleImage-body-left">
        <info-div class="singleImage-title">ADGH定制卫衣冬季加绒加厚工作班服连帽外套DIY定做Logo印字</info-div>
        <info-div class="singleImage-desc">1688热销</info-div>
    </info-div>
pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
<div class="recommend-item-box recommend-ad-box"><div >
<info-div class="wrap">
    <info-div class="singleImage-img singleImage-img-left">
        <info-div class="img" style="background-image:url(https://p3.ssl.qhimgs0.com/sdm/360_200_/t011d9d6502f442963b.jpg)"><info-div class="ads-tag"></info-div></info-div>
    </info-div>
    <info-div class="singleImage-body singleImage-body-left">
        <info-div class="singleImage-title">一款完全免费的炒股软件?市场上的炒股软件是收费的更好一些么?</info-div>
        <info-div class="singleImage-desc">大观</info-div>
    </info-div>
pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
<div class="recommend-item-box recommend-ad-box"><div ></div></div>
<div class="recommend-item-box recommend-ad-box"><div ></div></div>
<div class="recommend-item-box recommend-ad-box"><div >
<info-div class="wrap">
    <info-div class="singleImage-img singleImage-img-left">
        <info-div class="img" style="background-image:url(https://p3.ssl.qhimgs0.com/sdm/360_200_/t0188c7a7a77de04dd8.jpg)"><info-div class="ads-tag"></info-div></info-div>
    </info-div>
    <info-div class="singleImage-body singleImage-body-left">
        <info-div class="singleImage-title">上班的人怎样玩好股票?</info-div>
        <info-div class="singleImage-desc">大观</info-div>
    </info-div>
pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
<div class="recommend-item-box recommend-ad-box"><div >
<info-div class="wrap">
    <info-div class="singleImage-img singleImage-img-left">
        <info-div class="img" style="background-image:url(https://p3.ssl.qhimgs0.com/sdm/360_200_/t01f80a90d60b7fb3f8.jpg)"><info-div class="ads-tag"></info-div></info-div>
    </info-div>
    <info-div class="singleImage-body singleImage-body-left">
        <info-div class="singleImage-title">什么是股票,怎么玩,请高手用通俗易懂的语言解释?</info-div>
        <info-div class="singleImage-desc">大观</info-div>
    </info-div>
pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
<div class="recommend-item-box recommend-ad-box"><div >
    (function() {
        var s = "_" + Math.random().toString(36).slice(2);
        document.write('<div style="" ></div>');
        (window.slotbydup = window.slotbydup || []).push({
            id: "u4623113",
            container: s
        });
    })();

pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
<div class="recommend-item-box recommend-ad-box"><div >
<info-div class="wrap">
    <info-div class="singleImage-img singleImage-img-left">
        <info-div class="img" style="background-image:url(https://p3.ssl.qhimgs0.com/sdm/360_200_/t01c3a4618bf3db848d.png)"><info-div class="ads-tag"></info-div></info-div>
    </info-div>
    <info-div class="singleImage-body singleImage-body-left">
        <info-div class="singleImage-title">你有什么相见恨晚的法语学习方法?</info-div>
        <info-div class="singleImage-desc">大观</info-div>
    </info-div>
pthread_join和pthread_detach的用法 【】转载】
C/C++:pthread_join()和pthread_detach()的区别
                        <div class="recommend-loading-box">
            <img src="https://csdnimg.cn/release/phoenix/images/feedLoading.gif">
        </div>
        <div class="recommend-end-box">
            <p class="text-center">没有更多推荐了,<a href="https://blog.csdn.net/" class="c-blue c-blue-hover c-blue-focus">返回首页</a></p>
        </div>
    </div>
</main>