【发布时间】:2010-12-31 02:51:51
【问题描述】:
我遇到了 Valgrind 的问题,告诉我我可能丢失了一些记忆:
==23205== 544 bytes in 2 blocks are possibly lost in loss record 156 of 265
==23205== at 0x6022879: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==23205== by 0x540E209: allocate_dtv (in /lib/ld-2.12.1.so)
==23205== by 0x540E91D: _dl_allocate_tls (in /lib/ld-2.12.1.so)
==23205== by 0x623068D: pthread_create@@GLIBC_2.2.5 (in /lib/libpthread-2.12.1.so)
==23205== by 0x758D66: MTPCreateThreadPool (MTP.c:290)
==23205== by 0x405787: main (MServer.c:317)
创建这些线程的代码 (MTPCreateThreadPool) 基本上获取一个等待 pthread_t 插槽块的索引,并用它创建一个线程。 TI 成为指向具有线程索引和 pthread_t 的结构的指针。 (简化/净化):
for (tindex = 0; tindex < NumThreads; tindex++)
{
int rc;
TI = &TP->ThreadInfo[tindex];
TI->ThreadID = tindex;
rc = pthread_create(&TI->ThreadHandle,NULL,MTPHandleRequestsLoop,TI);
/* check for non-success that I've omitted */
pthread_detach(&TI->ThreadHandle);
}
然后我们有一个函数 MTPDestroyThreadPool 循环遍历我们创建的所有线程并取消它们(因为 MTPHandleRequestsLoop 没有退出)。
for (tindex = 0; tindex < NumThreads; tindex++)
{
pthread_cancel(TP->ThreadInfo[tindex].ThreadHandle);
}
我在其他地方读到过(包括关于 SO 的其他问题),明确分离线程可以防止这种可能丢失的错误,但显然不是。有什么想法吗?
【问题讨论】:
标签: c multithreading memory memory-leaks pthreads