pthread的和std::thread的线程分离

#include <stdio.h>
#include <error.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>


void work1(void *arg)
{
    char *mem1 = (char *)malloc(100);
    free(mem1);
}

void work2(void *arg)
{
    char *mem2 = (char *)malloc(100);
    free(mem2);
}

int main()
{
    pthread_t thread_id1, thread_id2;
    pthread_create(&thread_id1, NULL, (void *)work1, NULL);
    pthread_create(&thread_id2, NULL, (void *)work2, NULL);

    //pthread_detach(thread_id1);
    pthread_join(thread_id2, NULL);
    sleep(3);
    printf("%ld %ld", thread_id1, thread_id2);
    return 0;
}


对pthread传统要用pthread_join函数等待其结束,实际上pthread_join函数还有另一个功能:清理线程的资源。

因为有时候开启线程后并不关心线程什么时候结束,此时就需要使用pthread_detach来将线程分离。被分离的线程将由操作系统自动回收其资源。

也就意味着上述代码出现了一处内存泄露,因为线程1既没有被分离,也没有使用pthread_join等待其完成。

PS:(1)操作系统只会回收线程本身的资源开销,并不会回收线程在堆上分配的内存。假如将函数work1和work2中的内存释放语句free注释掉的话,本例中的内存泄露将会达到三处。

         (2)内存泄露可使用valgrind --tool=memcheck --leak-check=full ./a.out来检测。检测前必须安装valgrind且程序编译要加上-g选项。

         (3)线程在创建的时候可将属性设置为分离,这样就自动具备了分离属性,就无需显示调用pthread_detach了。


下面来看C++11中的线程的分离。与pthread原理类似。

#include <iostream>
#include <thread>
using namespace std;

void work()
{
    cout << std::this_thread::get_id() << endl;
}

int main()
{
    thread t1(work);
    thread t2(work);
    t1.join();
    t2.detach();
    return 0;
}

代码是不是简洁了不少?

需要注意的是不管是将线程t1的join函数注释,或是将t2的detach注释掉,程序都会崩溃。为什么呢?

因为C++有异常机制,而本例中没有对异常进行捕获。


以上两个例子测试系统是ubuntu 14.04.3,gcc(g++)的版本是4.6.3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
pthreadstd::thread是用于实现多线程编程的API。 pthread是一个用于C语言的多线程库,它提供了一些函数来创建、管理和同步线程,以及操作线程的属性和调度等功能。在使用pthread时,需要手动管理线程的创建、销毁和同步等操作。 而std::threadC++11标准库提供的多线程支持,它提供了一个高层的线程类,简化了线程的创建和管理过程。使用std::thread可以更方便地创建线程、传递参数、等待线程完成等。与pthread相比,std::thread更加面向对象化,可以更好地与C++的其他特性进行整合。 虽然std::threadC++11标准库中已经提供了对线程的支持,但在一些特定情况下,可能仍然需要使用底层的线程库,如Windows线程或Pthread。在这种情况下,可以使用SuspendThread函数来控制线程的执行。 总的来说,pthread是C语言的多线程库,而std::thread是C++的多线程支持。它们都可以用来进行多线程编程,选择使用哪种方式主要取决于编程语言的选择和具体需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [从 pthread 转换到 std::thread](https://blog.csdn.net/weixin_33916256/article/details/89679279)[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_1"}}] [.reference_item style="max-width: 50%"] - *3* [SuspendThread:暂停线程 v0.1.0](https://download.csdn.net/download/weixin_42117267/19358247)[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_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值