- 浏览: 202024 次
- 性别:
- 来自: 重庆
文章分类
最新评论
Linux程序设计中,创建线程时调用pthread_create()函数,该函数原型如下:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
其
中第二个参数attr为线程属性指针,一般情况下,我们创建线程时,若对线程属性没有特殊要求,都将此参数设为NULL,这也就使用了线程的默认属性-
非分离状态(joinable,或称可接合状态),之后,主线程必须在适当的时候调用pthread_join(),来接合(join,或等待,同步)子
线程,同时释放线程本身占用的资源;否则,线程资源将驻留内存,直到整个进程退出为止.若进程会不断的创建线程,则每创建一次线程都会导致内存资源的消
耗,很明显,这已经构成了内存泄漏!
关于这个问题,举出本人查到的佐证
1)) Linux man page里是这样讲的:
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
2)) <<Linux高级编程>>里是这样讲的:
可接合(需要等待)的线程,就像一个进程一样,当它执行结束时,并没有被GNU/Linux自动清理,而它的退出状态却仍在系统内挂着(这有点像僵尸进程),直到另一个线程调用pthread_join()获取其返回值时,其资源才被释放.
可接合(需要等待)的线程,就像一个进程一样,当它执行结束时,并没有被GNU/Linux自动清理,而它的退出状态却仍在系统内挂着(这有点像僵尸进程),直到另一个线程调用pthread_join()获取其返回值时,其资源才被释放.
对于线程资源的释放,有两种实现方法:
(1) 线程创建时,默认属性是可接合的(joinable),那就需要主线程来等待,所以在创建这个线程后适当的时候就必须调用pthread_join()来等待子线程结束执行,否则就会引起内存泄漏!
在 调用pthread_create()开线程后,若线程属性是joinable,则必须调用pthread_join()来等待子线程结束执行,这是 Linux同步主线程和子线程的一个机制,但是,这并不等于说,我要在pthread_create()开线程后立即调用pthread_join()来 等待该线程结束执行,的确,那样的话跟你用普通函数调用来实现是没有区别的,你完全可以在pthread_create()开线程后去做别的事情,等你觉 得应该等待该线程结束执行时再调用pthread_join().这就是说,假如你的线程采用了默认属性joinable,你就必须在适当的时候调用 pthread_join()来同步主线程和子线程,同时释放子线程的资源(线程描述符和堆栈(thread descriptor and stack)).
假如你用了默认线程属性,即线程属性为joinable,而又没有在适当的时候调用pthread_join(),那么该线程所占用的资源便不会被释放(kind of like a zombie process),因此造成内存泄漏.
假如你不想或没有必要同步主线程和子线程,那么就把子线程属性设置为detached分离状态,那么子线程结束执行后会自行销毁其占用的资源.
(2)
将线程属性设为分离状态(detached),这个样子线程就属于自灭那种,子线程函数启动后跟主线程不再有"父子"关系(等待和被等待),退出线程时其
资源会释放.注意:创建线程时,若属性参数为NULL,则线程属性默认为可接合的(joinable,即需要主线程等待的).
可以在线程创建时将其属性设为分离状态(detached),也可在线程创建后将其属性设为分离的(detached).
可以在线程创建时将其属性设为分离状态(detached),也可在线程创建后将其属性设为分离的(detached).
#include <pthread.h>
void* thread_function (void* thread_arg)
{
pthread_exit(“Exiting from the thread_function!”);
}
int main ()
{
pthread_t thr;
void* thread_result;
pthread_create (&thr, NULL, &thread_function, NULL);
}
int main ()
{
pthread_t thr;
void* thread_result;
pthread_create (&thr, NULL, &thread_function, NULL);
pthread_join(thr, &thread_result);
return 0;
}
return 0;
}
(2) 将线程属性设为detached的两种方法的代码框架,
<1> Example Code of Setting a Thread DETACHED(1)
在线程创建时,通过属性变量设置
在线程创建时,通过属性变量设置
#include <pthread.h>
void* thread_function (void* thread_arg)
{
pthread_exit(….);
}
int main ()
{
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread, &attr, &thread_function, NULL);
pthread_attr_destroy (&attr);
return 0;
}
}
int main ()
{
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread, &attr, &thread_function, NULL);
pthread_attr_destroy (&attr);
return 0;
}
<2> Example Code of Setting a Thread DETACHED(2)
线程创建后,通过调用pthread_detach()来设置
线程创建后,通过调用pthread_detach()来设置
#include <pthread.h>
void* thread_function (void* thread_arg)
{
pthread_exit(....);
}
int main ()
{
pthread_t thread;
pthread_create (&thread, NULL, &thread_function, NULL);
pthread_detach(thread);
return 0;
}
{
pthread_t thread;
pthread_create (&thread, NULL, &thread_function, NULL);
pthread_detach(thread);
return 0;
}
发表评论
-
线程属性pthread_attr_t简介
2013-01-05 10:57 3863本文编辑整理自: http://hi.baidu.c ... -
避免内存碎片
2012-12-13 10:49 1444许多书籍提到过内存碎片,也看到一些方法防治内存 ... -
EPOLL ET 模式下事件触发的场景
2012-09-25 10:13 1812ET模式称为边缘触发模式,顾名思义,不到边缘情况,是死都 ... -
惊群问题的思考
2012-09-25 10:13 905“据说”惊群问题已经是一个很古老的问题了,并且在大多数系统中已 ... -
linux惊群问题之udp
2012-09-25 10:12 1572今天测试udp服务器进程时发现log中记录了 ... -
getaddrinfo()函数详解
2012-09-19 10:59 8231. 概述IPv4中使用gethostbyname()函数完成 ... -
Linux的mmap文件内存映射机制
2012-09-19 15:00 2278在讲述文件映 ... -
Berkeley DB 由浅入深【转自架构师杨建】
2012-09-19 15:00 1919在网上看到不少介绍Berkeley DB的文章,几乎 ... -
linux 多线程编程
2012-09-19 15:00 1458进程与线程 进程是程序执行时的一个实例 ... -
pthread_cond_wait()
2012-09-25 10:13 796/************pthread_cond_w ... -
linux下创建守护进程(daemon process)代码
2012-09-18 13:47 1592#include <stdio.h> ... -
dup and dup2的剖析
2012-09-18 13:35 626dup和dup2都可用来复制一个现存的文件描述符,使两个 ... -
C语言系统资源控制(getrlimit && setrlimit)
2012-09-18 11:52 924每一个进程都有自己的一组资源限制,在(*)inux系统中 ... -
UNIX缓冲机制
2012-09-18 11:11 975某日一朋友写了一个HELL ...
相关推荐
LinuxC系统程序设计详细的描述了在Linux下面利用线程 进程 线程同步 进程通信 TCP/UDP的网络编程 本书由浅入深 是程序员学习Linux程序设计的的好帮手
linux程序设计环境:CH14 Linux程序设计VI - 线程.pptx
基于Linux的python多线程爬虫程序设计.pdf
linux多线程间使用共享内存例程,C++版本。可用于大量数据的多线程共享。
opencv3和opencv4多线程内存泄漏问题:以cv::resize函数测试结果为例。 使用中可修复或者可避免内存泄漏:1)使用opencv2的版本;2)在代码中设置修复该问题.
目前Linux系统己很普及,但是介绍在Linux上进行开发的书籍并...Linux程序设计权威指南内容包括Linux开发环境、Linux编程的入门知识、系统和网络编程、多线程程序设计、控制台编程、XWindow系统编程、国际化编程知识等。
UNIX Linux实验教程 5实验五Linux多线程程序设计.doc
Linux下基于多线程的服务器程序设计.pdf
1.2 Linux程序设计 1. 2.1 Linux程序 1. 2.2 文本编辑器 1. 2.3 C语言编译器 1. 2.4 开发系统导引 1.3 获得帮助 1.4 小结 第2章 shell程序设计 2.1 为什么使用shell编程 ...
Linux多线程Linux多线程Linux多线程Linux多线程Linux多线程Linux多线程Linux多线程
嵌入式 Linux 应用程序开发 第9章多线程编程 华清远见
1.2 Linux程序设计 1. 2.1 Linux程序 1. 2.2 文本编辑器 1. 2.3 C语言编译器 1. 2.4 开发系统导引 1.3 获得帮助 1.4 小结 第2章 shell程序设计 2.1 为什么使用shell编程 ...
Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux...
基于Linux的python多线程爬虫程序设计
posix多线程程序设计源码 posix多线程程序设计源码 posix多线程程序设计源码 posix多线程程序设计源码
Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...
Linux程序设计中文第四版,找了很久得到的,主要内容有shell脚本,多线程,makefile编写,socket编程,mysql的连接
Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)...
基于Linux的python多线程爬虫程序设计_李俊丽.pdf
Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...