首页 > 其他分享 >pthread_detach函数

pthread_detach函数

时间:2024-01-26 17:57:40浏览次数:24  
标签:状态 detach attr 线程 pthread include 函数

 线程分离状态:指定该状态,线程主动与主控线程断开关系。使用pthread_exit或者线程自动结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。

        进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。

        也可使用 pthread_create函数参2(线程属性)来设置线程分离。pthread_detach函数是在创建线程之后调用的。

函数描述:实现线程分离
函数原型:int pthread_detach(pthread_t thread);
函数返回值:成功:0;失败:错误号
         一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

以一个例子引入:编写程序,在创建线程之后设置线程的分离状态。

说明:如果线程已经设置了分离状态,则再调用pthread_join就会失败,可用这个方法验证是否已成功设置分离状态。

#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
 
//线程执行函数
void *mythread(void *arg)
{
        cout << "child thread, pid==" << getpid() << ", id==" << pthread_self() << endl;
        sleep(10);
}
 
int main()
{
        //int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    //                      void *(*start_routine) (void *), void *arg);
        //创建子线程
        pthread_t thread;
        int ret = pthread_create(&thread, NULL, mythread, NULL);
        if(ret!=0)
        {
                cout << "pthread_create error, " << strerror(ret) << endl;
                return -1;
        }
        cout << "main thread, pid==" << getpid() << ", id==" << pthread_self() << endl;
 
        //设置线程为分离属性
        pthread_detach(thread);
 
        //子线程设置分离属性,则pthread_join不再阻塞,立刻返回
        ret = pthread_join(thread, NULL);
        if(ret!=0)
        {
 
                cout << "pthread_join error, " << strerror(ret) << endl;
        }
 
        //目的是为了让子线程能够执行起来
        sleep(1);
        return 0;
}

也可以利用pthread_create的第二个参数设置分离属性,部分核心代码如下:

int main()
{
        //定义pthread_attr_t类型的变量
        pthread_attr_t attr;
 
        //初始化attr变量
        pthread_attr_init(&attr);
 
        //设置attr为分离属性
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 
        //创建子线程
        pthread_t thread;
        int ret = pthread_create(&thread, &attr, mythread, NULL);
        if(ret!=0)
        {
                cout << "pthread_create error, " << strerror(ret) << endl;
                return -1;
        }
        cout << "main thread, pid==" << getpid() << ", id==" << pthread_self() << endl;
 
        //释放线程属性
        pthread_attr_destroy(&attr);
 
        //验证子线程是否为分离属性
        ret = pthread_join(thread, NULL);
        if(ret!=0)
        {
                cout << "pthread_join error, " << strerror(ret) << endl;
        }
 
        return 0;
}

 

 

 

转载自:https://blog.csdn.net/m0_60663280/article/details/121589479

标签:状态,detach,attr,线程,pthread,include,函数
From: https://www.cnblogs.com/FBsharl/p/17990054

相关文章

  • 【C++】 select函数介绍
    在使用C++语言开发网络应用程序时,常常需要用到select函数。select函数是一种多路复用机制,可以同时监听多个文件描述符上可读、可写、异常等事件,从而让程序能够高效地处理多个连接。下面详细介绍C++中的select函数。1.select函数的定义和作用select函数的定义为:intselect(intn......
  • Rust 中的函数式语言功能:迭代器与闭包
    对原文做了删减,原文参考Rust中的函数式语言功能:迭代器与闭包。目录闭包:可以捕获环境的匿名函数闭包会捕获其环境闭包类型推断和注解捕获引用或者移动所有权将被捕获的值移出闭包和Fntrait使用迭代器处理元素序列Iteratortrait和next方法消费迭代器的方法产生其他迭代器的......
  • 量化交易开发之函数API(四)
    量化交易开发之函数API(四)以前面策略代码为例进行讲解,如下:definitialize(context):run_daily(period,time='every_bar')g.security='000001.XSHE'defperiod(context):order(g.security,100)下面我们讲解一下python中的函数知识:order(......
  • 无涯教程-Scala - 函数声明
    函数是执行任务的一组语句,您可以将代码分成单独的函数,从逻辑上讲,划分通常是使每个函数执行特定任务。函数声明Scala函数声明具有以下形式-deffunctionName([listofparameters]):[returntype]如果您不使用等号和方法主体,则方法被隐式声明为抽象。函数定义Scala函数定......
  • js封装防抖函数
    js封装的防抖函数/**防抖函数*@param{Function}func*@param{number}wait*@param{boolean}immediate*@return{*}*/exportfunctiondebounce(func,wait,immediate){lettimeout,args,context,timestamp,resultconstlater=function(){......
  • sql自学笔记(三)常见函数
    select函数名(实参列表)from表concat拼接将姓变大写,名变小写,然后拼接>selectconcat(upper(last_name),lower(first_name))姓名fromemployeessubstr/substring截取子串selectsubstr('我爱上你',2)截取从指定索引处后面所有字符,sql索引从1开始selectsubs......
  • 欧拉函数
    欧拉函数欧拉函数\(\varphi(n)\)表示\(1\simn-1\)中与\(n\)互质的数的个数。显然的,当\(n\)为质数,有\(\varphi(n)=n-1\)。性质与推导显然的,当\(\gcd(a,b)\),有\(\varphi(a\timesb)=\varphi(a)\times\varphi(b)\),oi-wiki上管这个叫做积性函数。显......
  • JS中的箭头函数与this
    JS中的箭头函数与thisJavaScript在ES6语法中新增了箭头函数,相较于传统函数,箭头函数不仅更加简洁,而且在this方面进行了改进。this作为JavaScript中比较诡异的存在,许多文章对于this的解释也不尽相同,本篇文章试图厘清JS中函数与this的关系。一、JS中函数的写法1.常规函数的写法......
  • 依次替换(函数集团)
    问题:将以下考题中的空格替换为正确答案。这个以前几乎不可能用函数解决的问题现在已经不是问题了。=REDUCE(A2,TEXTSPLIT(B2,";"),LAMBDA(x,y,SUBSTITUTE(x,"",y,1)))第一次运算:x指代A2,y指代TextSplit结果的第一个值,利用Substitute将x中第一个空格替换成y;第二次运算:x指......
  • 29虚函数-静态绑定-动态绑定
    虚函数-静态绑定-动态绑定如果类中定义了虚函数,那么编译阶段,编译器会给这个类类型产生一个唯一的vftable虚函数表,其中主要存储的是RTTI指针和虚函数的地址。程序运行时,每一张虚函数表都会加载到内存的.rodata只读数据区。一个类中定义了虚函数,那么这个类的对象,其运行时,内存中开......