【问题标题】:pthread_created followed by pthread_join valgrind possible loss cpthread_created 后跟 pthread_join valgrind 可能丢失 c
【发布时间】:2019-06-23 11:04:25
【问题描述】:

我有关于丢失记忆的 valgrind 错误的问题。 这是我的代码:

if((err = pthread_create(&handlert, NULL, &handler, NULL)) != 0) perror(..)

if((err = pthread_create(&mastert , NULL, &createmaster, NULL)) != 0) perror(..)

for(int i = 0; i < THREADSINPOOL; i++) {
    if((err = pthread_create(&(f[i]), NULL, &createpool, NULL)) != 0) perror(..)
}

if((err = pthread_join(handlert,(void*) &sRet[1])) != 0) perror(..)

if((err = pthread_join(mastert,(void*) &lRet[1])) != 0) perror(..)

for(int i = 0; i < THREADSINPOOL; i++) {
    if((err = pthread_join(f[i], (void*) &wRet[i])) != 0) perror(..)
}
return 0;

我对每个线程都有一个连接,我正在检查结果,但 valgrind 仍然说:

==21610== 560 bytes in 1 blocks are possibly lost in loss record 8 of 12
==21610==    at 0x4C2CC90: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==21610==    by 0x4012E44: allocate_dtv (dl-tls.c:296)
==21610==    by 0x4012E44: _dl_allocate_tls (dl-tls.c:460)
==21610==    by 0x4E3FCC0: allocate_stack (allocatestack.c:589)
==21610==    by 0x4E3FCC0: pthread_create@@GLIBC_2.2.5 (pthread_create.c:495)
==21610==    by 0x401B3B: main (myfile.c:85)

(每次创建 pthread 时都会出现相同的错误,仅更改代码行) 提前谢谢!

编辑: 编译中的标志:--leak-check=full -std=c99 -Wall -pedantic -g -DMAKE_VALGRIND_HAPPY 只有这个错误(看起来不像是以前错误的结果)

【问题讨论】:

  • 你的 valgring 版本是什么?
  • @n.m.valgrind-3.10.0
  • 你可能想升级,我的是 3.13.0。
  • @n.m.我需要使用这个版本,因为它是大学的一个项目,他们检查这个版本。
  • 你能发一个 minimal reproducible example 来证明 valgrind 报告误报吗?

标签: c memory-leaks valgrind


【解决方案1】:

我不认为这是一个真正的泄漏,或者如果它是最有可能在低级代码中。是否应该将其视为泄漏或急切的优化也是值得商榷的。

http://sourceware.org/ml/glibc-bugs/2007-04/msg00036.html:

这不是真正的泄漏。据我所知分配的缓冲区 pthread_create() 用于扩展线程堆栈。 如果你再次 pthread_join() 和 pthread_create() 中的旧位置 堆栈将被新堆栈使用。

https://stackoverflow.com/a/17642468/714501中也提到了这一点

POSIX 线程的一些实现(我猜你正在使用 glibc/NPTL)缓存和重用线程资源,而不是完全释放它们。

我认为对于这种情况,您可以安装 valgrind 抑制:

http://valgrind.org/docs/manual/mc-manual.html#mc-manual.suppfiles

【讨论】:

  • 您好!感谢您的快速答复!不幸的是我不能抑制 valgrind.. 这是一个大学项目,他们测试 valgrind 结果(不允许 valgrind 错误)所以我必须以某种方式删除这个错误!
  • @ElenaGuidi 有趣。好吧,总有一种解决方法。首先是简单的问题 - 他们是否让您链接到不同的 libc?例如。 musl-libc.org
  • 好问题!他们说我们必须使用课程中完成的东西..我们没有研究过这个库,所以我认为是不允许的。
  • @ElenaGuidi 你可能想和你的教授谈谈,询问你应该使用什么版本的 gcc、valgrind、libc……。然后,如果这不起作用,请再次与他们交谈并证明它不起作用。我在 Ubuntu 18 上的 pthreads 程序没有遇到任何 valgrind 错误,因此您可能想尝试一下。
  • @ElenaGuidi 另一种选择是使用您提供堆栈的版本。试试man7.org/linux/man-pages/man3/pthread_attr_setstack.3.html 看看是否仍然触发错误。
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多