pthread_join与pthread_detach细节问题
来源:互联网 发布:ubuntu启动网卡命令 编辑:程序博客网 时间:2024/05/16 07:48
pthread_t pthr;
pthread_create(&pthr, NULL, thread_handler, NULL);
...
void* thread_handler(void* arg)
{
/* do something */
pthread_join(pthr, NULL);
}
上面的代码不好使,pthread_join不能放在pthread调用的handler内,虽然不报错,但是thread无法正常回收,如果多次创建thread,内存会越来越大(另一种形式的内存泄露)。
正确的做法是在handler外面pthread_join:
pthread_t pthr;
pthread_create(&pthr, NULL, thread_handler, NULL);
pthread_join(pthr, NULL);
...
void* thread_handler(void* arg)
{
/* do something */
}
如果不用pthread_join,改用pthread_detach呢?那最方便,但要注意:pthread_detach最好是放在handler里面第一句。
void* thread_handler(void* arg)
{
pthread_detach(pthr);
/* do something */
}
如果pthread_create后紧跟pthread_detach,有可能会出错。
pthread_detach(pthread_self())
linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,
如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。
若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,
如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。
若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己, 如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为 joinable,然后适时调用pthread_join.
其实简单的说就是在线程函数头加上 pthread_detach(pthread_self())的话,线程状态改变,在函数尾部直接 pthread_exit线程就会自动退出。省去了给线程擦屁股的麻烦
阅读全文
0 0
- pthread_join与pthread_detach细节问题
- pthread_join与pthread_detach细节问题
- pthread_join与pthread_detach细节问题
- pthread_join与pthread_detach细节问题
- pthread_join与pthread_detach细节问题
- pthread_join与pthread_detach细节问题
- [pthread] pthread_join 与 pthread_detach
- pthread_detach与pthread_join区别
- pthread_join与pthread_detach详解(转)
- APUE-线程及其属性:pthread_join与pthread_detach
- 简析pthread_join()和pthread_detach()
- pthread_join pthread_exit pthread_detach
- pthread_join和pthread_detach详解
- 简析pthread_join()和pthread_detach()
- pthread_join和pthread_detach详解
- pthread_join和pthread_detach详解
- pthread_join和pthread_detach详解
- pthread_join()和pthread_detach()
- Python IDLE 快捷键
- 一个著名的日志系统Log4j
- spark基础之RDD和DataFrame和Dataset比较
- Android动画知识汇总
- caffe执行draw.py的错误汇总
- pthread_join与pthread_detach细节问题
- redis 入门
- 特殊权限和软硬链接
- 表格锁栏的巧妙实现
- 偏门推广方法,日流量10000的网站是怎么推广的?
- 1007. Maximum Subsequence Sum (25)
- C算法入门——小题实践
- js科学技术法,10的几次方
- spark基础之RDD和DataFrame的转换方式