Я создал поток JOINABLE, а затем отменил его в конце программы, например,
rc2 = pthread_attr_init(&attr);
ERR_IF( rc2 != 0 );
rc2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
ERR_IF( rc2 != 0 );
rc2 = pthread_create(&destroy_thread, &attr, destroy_expired_sessions, NULL);
ERR_IF( rc2 != 0 );
...
rc2 = pthread_cancel(destroy_thread);
ERR_IF( rc2 != 0 );
rc2 = pthread_join(destroy_thread, &status);
ERR_IF( rc2 != 0 || (int *)status != PTHREAD_CANCELED);
Тем не менее, есть утечка памяти с pthread_cancel (), проанализированная valgrind:
==17583== 28 bytes in 1 blocks are still reachable in loss record 1 of 1
==17583== at 0x4006878: malloc (in /m/mls/pkg/trees/2008Q3/ix86-Linux-RHEL5/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==17583== by 0x79FAC1: _dl_map_object_deps (in /lib/ld-2.5.so)
==17583== by 0x7A4A67: dl_open_worker (in /lib/ld-2.5.so)
==17583== by 0x7A0DA5: _dl_catch_error (in /lib/ld-2.5.so)
==17583== by 0x7A43F1: _dl_open (in /lib/ld-2.5.so)
==17583== by 0x8BF2E1: do_dlopen (in /lib/libc-2.5.so)
==17583== by 0x7A0DA5: _dl_catch_error (in /lib/ld-2.5.so)
==17583== by 0x8BF494: __libc_dlopen_mode (in /lib/libc-2.5.so)
==17583== by 0x9527D6: pthread_cancel_init (in /lib/libpthread-2.5.so)
==17583== by 0x94EC1B: pthread_cancel (in /lib/libpthread-2.5.so)
==17583== by 0x80860CF: authDeinit (authAPI.c:1545)
==17583== by 0x807F280: main (test_sessionList.c:124)
==17583==
==17583== LEAK SUMMARY:
==17583== definitely lost: 0 bytes in 0 blocks.
==17583== possibly lost: 0 bytes in 0 blocks.
==17583== still reachable: 28 bytes in 1 blocks.
==17583== suppressed: 0 bytes in 0 blocks.
Кажется, дефект самой функции pthread_cancel ().Похоже, что malloc () немного памяти, но не освободил () позже.Есть ли способ избежать утечки памяти здесь?