pthread_detach函数

int pthread_detach(pthread_t thread);    成功:0;失败:错误号

作用:从状态上实现线程分离,注意不是指该线程独自占用地址空间。

线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后(不会产生僵尸线程),其退出状态不由其他线程获取,而直接自己自动释放(自己清理掉PCB的残留资源)。网络、多线程服务器常用。

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

也可使用 pthread_create函数参2(线程属性)来设置线程分离。

一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止(或者进程终止被回收了)。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误(22号错误)。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

//使用pthread_detach函数实现线程分离

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>void *tfn(void *arg)
{int n = 3;while (n--) {printf("thread count %d\n", n);sleep(1);}//return (void *)1;pthread_exit((void *)1);
}int main(void)
{pthread_t tid;void *tret;int err;#if 0pthread_attr_t attr;            /*通过线程属性来设置游离态(分离态)*/pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);pthread_create(&tid, &attr, tfn, NULL);#elsepthread_create(&tid, NULL, tfn, NULL);pthread_detach(tid);         //让线程分离  ----自动退出,无系统残留资源#endifwhile (1) {err = pthread_join(tid, &tret);printf("-------------err= %d\n", err);if (err != 0)fprintf(stderr, "thread_join error: %s\n", strerror(err));elsefprintf(stderr, "thread exit code %d\n", (int)tret);sleep(1);}return 0;
}

[root@localhost 01_pthread_test]# ./pthrd_detach

-------------err= 22       //可见错误号是22

thread count 2

thread_join error: Invalid argument  //错误号对应的详细解释

thread count 1

-------------err= 22

thread_join error: Invalid argument

-------------err= 22

thread count 0

thread_join error: Invalid argument

-------------err= 22

thread_join error: Invalid argument

-------------err= 22

thread_join error: Invalid argument

分析:

  1. 使用pthread_detach函数实现线程分离时,应当先创建线程(pthread_create),然后再用pthread_detach实现该线程的分离。因此,这种方式与修改线程属性来实现线程分离的方法相比,不会发生在线程创建函数还未来得及返回时子线程提前结束导致返回的线程号是错误的线程号的情况。因为采用这种方法,即使子线程提前结束(先于pthread_create返回),但是子线程还未处于分离状态,因此其PCB的残留信息依然存在,如线程号等一些系统资源,所以线程号等系统资源仍被占据,还未分配出去,所以创建函数返回的线程号依然是该线程的线程号;
  2. 对处于分离状态的线程进行回收,会出现错误,且错误编号为22;
  3. 还可采用修改线程属性的方法来实现线程分离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++ Primer | 15】面试问题

在成员函数中调用虚函数 #include <iostream> using namespace std; class CBase { public:void func1(){func2();}virtual void func2() {cout << "CBase::func2()" << endl;} }; class CDerived:public CBase { public:virtual void func2() {…

pthread_cancel、pthread_equal函数

&#xff08;1&#xff09;pthread_cancel函数 int pthread_cancel(pthread_t thread); 成功&#xff1a;0&#xff1b;失败&#xff1a;错误号 作用&#xff1a;杀死(取消)线程&#xff0c;其作用对应进程中 kill() 函数。 注意&#xff1a;线程的取消并不是实时的&…

STL源码剖析面试问题

当vector的内存用完了&#xff0c;它是如何动态扩展内存的&#xff1f;它是怎么释放内存的&#xff1f;用clear可以释放掉内存吗&#xff1f;是不是线程安全的&#xff1f; vector内存用完了&#xff0c;会以当前size大小重新申请2* size的内存&#xff0c;然后把原来的元素复制…

线程与进程的控制原语对比

线程与进程的控制原语对比 fork pthead_create exit( int ) pthead_exit(void *); wait(int *) pthread_join&#xff08; ,void **&#xff09; 阻塞 ;分离 22 &#xff1b;cancel -1 kill() pthread_cancel(); 取消点(检查点)&#xff1a;系统调用 getpid() pthrea…

ptmalloc堆内存管理机制(主要讨论Linux x86下32位系统)

bin&#xff08;chunk容器&#xff09; ptmalloc将相似大小的 chunk 用双向链表链接起来&#xff0c;这样的一个链表被称为一个 bin。 Ptmalloc 一共维护了 128 个 bin&#xff0c;并使用一个数组来存储这些 bin&#xff0c;这个数组被成为bin数组。 bin数组结构如下&#xf…

线程属性的修改

&#xff08;1&#xff09;线程属性 Linux下线程的属性是可以根据实际项目需要&#xff0c;进行设置&#xff0c;之前我们讨论的线程都是采用线程的默认属性&#xff0c;默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性…

NPTL(Native POSIX Thread Library)

1.NPTL&#xff08;Native POSIX Thread Library&#xff09;为POSIX标准线程库&#xff0c;查看当前Linux系统的pthread库&#xff08;线程库&#xff09;版本的命令为&#xff1a;getconf GNU_LIBPTHREAD_VERSION。 [rootlocalhost 01_pthread_test]# getconf GNU_LIBPTHREA…

线程使用注意事项

1.主线程退出其他线程不退出&#xff0c;主线程应调用pthread_exit&#xff1b; 2.避免僵尸线程&#xff1a;pthread_join、pthread_detach、pthread_create指定分离属性。被join线程可能在join函数返回前就释放完自己的所有内存资源&#xff0c;所以不应当返回被回收线程栈中…

线程同步的概念

所谓同步&#xff0c;即同时起步&#xff0c;协调一致。不同的对象&#xff0c;对“同步”的理解方式略有不同。如&#xff0c;设备同步&#xff0c;是指在两个设备之间规定一个共同的时间参考&#xff1b;数据库同步&#xff0c;是指让两个或多个数据库内容保持一致&#xff0…

互斥量(mutex)

Linux中提供一把互斥锁mutex&#xff08;也称之为互斥量&#xff09;。每个线程在对资源操作前都尝试先加锁&#xff0c;成功加锁才能操作&#xff0c;操作结束解锁。资源还是共享的&#xff0c;线程间也还是竞争的&#xff0c;但通过“锁”就将资源的访问变成互斥操作&#xf…

洗牌算法

参考资料&#xff1a; 1. 洗牌算法汇总以及测试洗牌程序的正确性 2. 三种洗牌算法shuffle

Bloom Filter算法

一、概念 Bloom Filter的中文翻译叫做布隆过滤器&#xff0c;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法&#xff0c;缺点是有一定的误…

237. 删除链表中的节点

请编写一个函数&#xff0c;使其可以删除某个链表中给定的&#xff08;非末尾&#xff09;节点&#xff0c;你将只被给定要求被删除的节点。 现有一个链表 -- head [4,5,1,9]&#xff0c;它可以表示为: 示例 1: 输入: head [4,5,1,9], node 5 输出: [4,1,9] 解释: 给定你链表…

151. 翻转字符串里的单词

输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格&#xff0c;但是反转后的字符不能包括。 示例 3&#xff1a; 输入: "a good example" 输出: "example good a" 解释: 如果两个单…

进程间同步(互斥量、信号量)

进程间同步可以使用互斥量mutex&#xff08;互斥锁&#xff09;、信号量和文件锁。 进程间同步使用信号量&#xff1a; int sem_init(sem_t *sem, int pshared, unsigned int value); 用于进程间同步此时第二个参数不能取0了&#xff0c;取非0值用于进程间同步&#xff0c;一…

1059 Prime Factors(25 分)

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N p​1​​​k​1​​​​p​2​​​k​2​​​​⋯p​m​​​k​m​​​​. Input Specification: Each input file contains one test case which gives a…

STL源码剖析

1. 当vector的内存用完了&#xff0c;它是如何动态扩展内存的&#xff1f;它是怎么释放内存的&#xff1f;用clear可以释放掉内存吗&#xff1f;是不是线程安全的&#xff1f; vector内存用完了&#xff0c;会以当前size大小重新申请2* size的内存&#xff0c;然后把原来的元素…

C++ 内存管理机制

内存分配方式 简介 在C中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存…

哲学家用餐模型

分析&#xff1a; 为了避免死锁&#xff0c;做了如下规定&#xff1a;每个哲学家先拿自己左手边的筷子&#xff0c;然后再去拿右手边的筷子&#xff0c;如果不能同时得到两支筷子&#xff0c;则该哲学家放下手中已有的筷子。这种规定依然会因为振荡而产生死锁&#xff0c;例如…

【C++ Primer | 16】std::move和std::forward、完美转发

右值引用应该是C11引入的一个非常重要的技术&#xff0c;因为它是移动语义&#xff08;Move semantics&#xff09;与完美转发&#xff08;Perfect forwarding&#xff09;的基石&#xff1a; 移动语义&#xff1a;将内存的所有权从一个对象转移到另外一个对象&#xff0c;高效…