I'm writing a program using the pthread library. When i run my program with the command valgrind --leak-check=full, i get the following errors description:
我正在使用pthread库编写程序。当我用命令valgrind --leak-check = full运行我的程序时,我得到以下错误描述:
==11784==
==11784== **HEAP SUMMARY:**
==11784== in use at exit: 4,952 bytes in 18 blocks
==11784== total heap usage: 1,059 allocs, 1,041 frees, 51,864 bytes allocated
==11784==
==11784== **288 bytes** in 1 blocks are possibly lost in loss record 2 of 3
==11784== at 0x4C2380C: calloc (vg_replace_malloc.c:467)
==11784== by 0x4010D2E: _dl_allocate_tls (dl-tls.c:300)
==11784== by 0x55DC218: **pthread_create**@@GLIBC_2.2.5 (allocatestack.c:570)
==11784== by 0x401BC0: initdevice(char*) (in /a/fr-01/vol/home/stud/lim/workspace /Ex3/l)
==11784== by 0x406D05: main (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)
==11784==
==11784== **4,608 bytes** in 16 blocks are possibly lost in loss record 3 of 3
==11784== at 0x4C2380C: calloc (vg_replace_malloc.c:467)
==11784== by 0x4010D2E: _dl_allocate_tls (dl-tls.c:300)
==11784== by 0x55DC218: **pthread_create**@@GLIBC_2.2.5 (allocatestack.c:570)
==11784== by 0x40268F: write2device(char*, int) (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)
==11784== by 0x406D7B: main (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)
==11784==
==11784== **LEAK SUMMARY:**
==11784== definitely lost: 0 bytes in 0 blocks
==11784== indirectly lost: 0 bytes in 0 blocks
==11784== possibly lost: 4,896 bytes in 17 blocks
==11784== still reachable: 56 bytes in 1 blocks
==11784== suppressed: 0 bytes in 0 blocks
==11784== Reachable blocks (those to which a pointer was found) are not shown.
==11784== To see them, rerun with: --leak-check=full --show-reachable=yes
==11784==
==11784== For counts of detected and suppressed errors, rerun with: -v
==11784== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)
Every time i call pthread_create, with a certain function - i call the function pthread_exit in the end of the function. So, after verifying this is not the problem, what could be the problem?
每当我调用pthread_create时,使用某个函数 - 我在函数的末尾调用函数pthread_exit。因此,在验证这不是问题之后,可能是什么问题?
5 个解决方案
#1
32
A thread's resources are not immediately released at termination, unless the thread was created with the detach state
attribute set to PTHREAD_CREATE_DETACHED
, or if pthread_detach
is called for its pthread_t
.
除非在将detach state属性设置为PTHREAD_CREATE_DETACHED的情况下创建线程,或者为其pthread_t调用pthread_detach,否则线程的资源不会在终止时立即释放。
An undetached thread will remain terminated state until its identifier is passed to pthread_join
or pthread_detach
.
未分离的线程将保持终止状态,直到其标识符传递给pthread_join或pthread_detach。
To sum it up, you have three options:
总结一下,您有三种选择:
- create your thread with detached attribute set(PTHREAD_CREATE_DETACHED attribute)
- Detach your thread after creation (by calling
pthread_detach
), or - Join with the terminated threads to recycle them (by calling
pthread_join
).
创建具有分离属性集的线程(PTHREAD_CREATE_DETACHED属性)
创建后分离线程(通过调用pthread_detach),或
加入已终止的线程以回收它们(通过调用pthread_join)。
Hth.
#2
4
when not working with joinable threads the exiting thread needs to call pthread_detach(pthread_self())
in order to release all its resources.
当不使用可连接线程时,退出线程需要调用pthread_detach(pthread_self())以释放其所有资源。
#3
3
Ot you can make the thread in detached state to avoid the memory leak if the thread should not be joined (or just expires on it's own)
你可以让线程处于分离状态,以避免内存泄漏,如果线程不应该连接(或只是自己过期)
To explicitly create a thread as joinable or detached, the attr argument in the pthread_create() routine is used. The typical 4 step process is:
要将线程显式创建为可连接或已分离,请使用pthread_create()例程中的attr参数。典型的4步流程是:
- Declare a pthread attribute variable of the pthread_attr_t data type
- Initialize the attribute variable with pthread_attr_init()
- Set the attribute detached status with pthread_attr_setdetachstate()
- When done, free library resources used by the attribute with pthread_attr_destroy()
声明pthread_attr_t数据类型的pthread属性变量
使用pthread_attr_init()初始化属性变量
使用pthread_attr_setdetachstate()设置属性分离状态
完成后,该属性使用的免费库资源与pthread_attr_destroy()
#4
0
In addition to the correct answers given you by other users, I suggest you to read this:
除了其他用户给出的正确答案之外,我建议你阅读:
Tracking down a memory leak in multithreaded C application
跟踪多线程C应用程序中的内存泄漏
#5
0
Please note that the default pthread_create behavior is "joinable" NOT DETACHED. Therefore some OS resources would still remain in the process after pthread finished, which would result in zombie pthread and leads to increased VIRTUAL/resident memory usage.
请注意,默认的pthread_create行为是“可连接的”NOT DETACHED。因此,在pthread完成后,某些OS资源仍将保留在进程中,这将导致僵尸pthread并导致VIRTUAL /驻留内存使用量增加。
The four solution @sehe mentioned would fix this problem.
@sehe提到的四个解决方案可以解决这个问题。
However if you thread is a long-standing one, this might not be really needed. for example, if the pthread lives through the whole life of the process.
但是,如果你是一个长期的线程,这可能不是真的需要。例如,如果pthread贯穿整个过程的生命。
#1
32
A thread's resources are not immediately released at termination, unless the thread was created with the detach state
attribute set to PTHREAD_CREATE_DETACHED
, or if pthread_detach
is called for its pthread_t
.
除非在将detach state属性设置为PTHREAD_CREATE_DETACHED的情况下创建线程,或者为其pthread_t调用pthread_detach,否则线程的资源不会在终止时立即释放。
An undetached thread will remain terminated state until its identifier is passed to pthread_join
or pthread_detach
.
未分离的线程将保持终止状态,直到其标识符传递给pthread_join或pthread_detach。
To sum it up, you have three options:
总结一下,您有三种选择:
- create your thread with detached attribute set(PTHREAD_CREATE_DETACHED attribute)
- Detach your thread after creation (by calling
pthread_detach
), or - Join with the terminated threads to recycle them (by calling
pthread_join
).
创建具有分离属性集的线程(PTHREAD_CREATE_DETACHED属性)
创建后分离线程(通过调用pthread_detach),或
加入已终止的线程以回收它们(通过调用pthread_join)。
Hth.
#2
4
when not working with joinable threads the exiting thread needs to call pthread_detach(pthread_self())
in order to release all its resources.
当不使用可连接线程时,退出线程需要调用pthread_detach(pthread_self())以释放其所有资源。
#3
3
Ot you can make the thread in detached state to avoid the memory leak if the thread should not be joined (or just expires on it's own)
你可以让线程处于分离状态,以避免内存泄漏,如果线程不应该连接(或只是自己过期)
To explicitly create a thread as joinable or detached, the attr argument in the pthread_create() routine is used. The typical 4 step process is:
要将线程显式创建为可连接或已分离,请使用pthread_create()例程中的attr参数。典型的4步流程是:
- Declare a pthread attribute variable of the pthread_attr_t data type
- Initialize the attribute variable with pthread_attr_init()
- Set the attribute detached status with pthread_attr_setdetachstate()
- When done, free library resources used by the attribute with pthread_attr_destroy()
声明pthread_attr_t数据类型的pthread属性变量
使用pthread_attr_init()初始化属性变量
使用pthread_attr_setdetachstate()设置属性分离状态
完成后,该属性使用的免费库资源与pthread_attr_destroy()
#4
0
In addition to the correct answers given you by other users, I suggest you to read this:
除了其他用户给出的正确答案之外,我建议你阅读:
Tracking down a memory leak in multithreaded C application
跟踪多线程C应用程序中的内存泄漏
#5
0
Please note that the default pthread_create behavior is "joinable" NOT DETACHED. Therefore some OS resources would still remain in the process after pthread finished, which would result in zombie pthread and leads to increased VIRTUAL/resident memory usage.
请注意,默认的pthread_create行为是“可连接的”NOT DETACHED。因此,在pthread完成后,某些OS资源仍将保留在进程中,这将导致僵尸pthread并导致VIRTUAL /驻留内存使用量增加。
The four solution @sehe mentioned would fix this problem.
@sehe提到的四个解决方案可以解决这个问题。
However if you thread is a long-standing one, this might not be really needed. for example, if the pthread lives through the whole life of the process.
但是,如果你是一个长期的线程,这可能不是真的需要。例如,如果pthread贯穿整个过程的生命。