首页 > 系统相关 >Linux多线程05-线程的分离

Linux多线程05-线程的分离

时间:2023-06-26 09:00:28浏览次数:47  
标签:thread 05 分离 ret 线程 pthread tid 多线程

pthread_detach

描述:

pthread_detach()函数将由thread标识的线程标记为已分离。当一个分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程与已终止的线程加入。尝试分离一个已经分离的线程会导致未指定的行为。

#include <pthread.h>
int pthread_detach(pthread_t thread);
    功能: 分离一个线程, 被分离的线程在终止时自动释放资源返回给系统
        1.不能多次分离, 会产生不可预料的行为
        2.不能去连接一个已经分离的线程, 会报错
    参数: 需要分离的线程ID
    返回: 成功-0 , 失败-错误号

Compile and link with -pthread.

代码示例

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

void* callback(void* arg){
    printf("child thread id: %ld\n",pthread_self());

    return NULL;
}

int main(){
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, callback, NULL);
    if(ret!=0){
        char* errstr = strerror(ret);
        printf("error_create: %s\n",errstr);
    }
    
    //输出主线程和子线程ID
    printf("tid: %ld, main thread id: %ld\n",tid,pthread_self());

    //设置子线程分离, 子线程分离后, 子线程结束时对应的资源就不需要主线程释放
    ret = pthread_detach(tid);
    if(ret!=0){
        char* errstr = strerror(ret);
        printf("error_detach: %s\n",errstr);
    }

    //分离线程后尝试再释放
    ret = pthread_join(tid, NULL);
    if(ret!=0){
        char* errstr = strerror(ret);
        printf("error_join: %s\n",errstr); //报错, 非法参数
    }

    pthread_exit(NULL);

    return 0;
}

运行结果

tid: 140639219562240, main thread id: 140639227950912
error_join: Invalid argument
child thread id: 140639219562240

标签:thread,05,分离,ret,线程,pthread,tid,多线程
From: https://www.cnblogs.com/anqwjoe/p/17504443.html

相关文章

  • Linux多线程08-线程同步
    一个多线程售票示例://三个窗口,共100张票#include<stdio.h>#include<pthread.h>#include<unistd.h>inttickets=100;//所有线程都共享这100张票void*sellticket(void*arg){//卖票while(tickets>0){usleep(6000);//间隔6000微秒p......
  • 04 | 05 深入浅出索引
    04|05深入浅出索引在MySQL中,索引是在存储引擎层实现的,所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样。而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。索引常见模型模型特点场景使用哈希表键值存储数据等值查询Memcach......
  • 异步注解@Async使用自定义线程池
    1.@Async注解@Async是java中一个注解,其作用就是加上该注解的类或方法能够异步执行任务,该注解添加到方法上时,表示该方法是异步方法,添加到类上时,表示该类中的所有方法都是异步方法。该注解的代码为:可以看出其是作用在类和方法上,能够在运行时被获取到。当在使用@Async时,如果不指......
  • QT为什么只能由主线程操作UI
    QT为什么只能由主线程操作UI背景QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。主线程:主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()启动事件循环的线程。原因直接原因:UI线程负责和用户交互,因此不能......
  • Java多线程-Lesson02
    一.Lamda表达式λ是希腊字母表的第十一位字母,英文名是LambdaLamda表达式的出现主要是为了避免匿名内部类过多的原因,它属于函数式编程的范畴 为什么要使用Lamda表达式?避免匿名内部类定义过多可以让你的代码看起来很简洁去掉了没有意义的代码,只留下一堆核心逻辑主要使用在......
  • java 中的多线程问题
    结论  全局变量 多线程非安全  (堆) static局部变量 多线程安全  (栈) fina也可以安全1:线程调用时,每一个线程都拥有一套完整的调用栈帧,栈帧中包含完整的调用方法名,方法的局部变量。而且栈是先入后出,调用方法时入栈,方法结束是出栈。2:使用线程池时需要注意参数问......
  • C# .NET6结束UI线程
    在.NET6项目中,不再支持Thread.Abort:Thread.AbortisnotsupportedandthrowsPlatformNotSupportedException.原因是Thread.Abort可能导致资源泄漏,1.不正常的关闭,导致线程运行过程中待释放资源的业务代码,未能完成执行。2.异常捕获,业务模块未添加捕获、业务模块添加了捕获但......
  • Selenium基础:鼠标操作 05
    *需要导入ActionChains类fromselenium.webdriver.common.action_chainsimportActionChains1、鼠标右击context_click(element)方法fromseleniumimportwebdriver#导入actionchainsfromselenium.webdriver.common.action_chainsimportActionChainsimporttime......
  • TNS-03505 名称无法解析
    TNS-03505名称无法解析问题现象:[oracle@db01admin]$tnspingpriTNSPingUtilityforLinux:Version11.2.0.4.0-Productionon15-JUN-201521:57:52Copyright(c)1997,2013,Oracle.Allrightsreserved.Usedparameterfiles:TNS-03505:Failedtoresolve......
  • 为什么js引擎是单线程?
    为什么js引擎是单线程?js的主要用途是与用户互动,以及操作DOM,这决定它只能是单线程。例:一个线程要添加DOM节点,一个线程要删减DOM节点,容易造成分歧。为了更好使用多CPU,H5提供了webWorker 标准,允许js创建多线程,但是子线程受到主线程控制,而且不得操作DOM。说说进程与线程的区别与......