表題の件につきましてお尋ねしたいです。
POSIXのtimer_create関数を使用すると、valgrindでメモリリークを検知してしまいます。検知を抑制すれば済む問題ではあるのですが、timer_create関数のソースコードを見ると、timer_create関数から作成されているヘルパー関数のスレッドが終了しないということが原因になっているように思います。
メモリリークしていないのかもしれないのですが、timer_create関数内で生成されたスレッドは終わらないのがデフォルトの挙動という理解でよいのでしょうか?
以下のコードをvalgirnd経由で実行すると、下部に記載するメモリのサマリが表示されます。
C
1#include <inttypes.h> 2#include <pthread.h> 3#include <signal.h> 4#include <stdint.h> 5#include <stdio.h> 6#include <stdlib.h> 7#include <string.h> 8#include <unistd.h> 9 10const struct itimerspec its = { .it_value = { 1 } }; 11const struct timespec ts = { 3 }; 12 13void notifyFunc(union sigval sv) 14{ 15 printf("notifyfunc: timer has expired.\n"); 16} 17 18int main(void) 19{ 20 struct sigevent se; 21 struct sigaction sa; 22 timer_t timerid_thread; 23 timer_t timerid_signal; 24 25 memset(&se, 0, sizeof(se)); 26 se.sigev_value.sival_int = 1; 27 se.sigev_notify = SIGEV_THREAD; 28 se.sigev_notify_function = notifyFunc; 29 se.sigev_notify_attributes = NULL; 30 timer_create(CLOCK_REALTIME, &se, &timerid_thread); 31 timer_settime(timerid_thread, 0, &its, NULL); 32 33 nanosleep(&ts, NULL); 34 35 int res; 36 res = timer_delete(timerid_thread); 37 printf("TIMER_DELETE RES: %d\n", res); 38 39 return 0; 40}
valgrindのサマリ
==28846== HEAP SUMMARY: ==28846== in use at exit: 272 bytes in 1 blocks ==28846== total heap usage: 10 allocs, 9 frees, 3,366 bytes allocated ==28846== ==28846== 272 bytes in 1 blocks are possibly lost in loss record 1 of 1 ==28846== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==28846== by 0x40134F6: allocate_dtv (dl-tls.c:286) ==28846== by 0x40134F6: _dl_allocate_tls (dl-tls.c:530) ==28846== by 0x504C227: allocate_stack (allocatestack.c:627) ==28846== by 0x504C227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644) ==28846== by 0x4E4151A: __start_helper_thread (timer_routines.c:176) ==28846== by 0x5053826: __pthread_once_slow (pthread_once.c:116) ==28846== by 0x4E403BA: timer_create@@GLIBC_2.3.3 (timer_create.c:101) ==28846== by 0x1089C6: main (in /home/xxx/sample/sample_timer_2) ==28846== ==28846== LEAK SUMMARY: ==28846== definitely lost: 0 bytes in 0 blocks ==28846== indirectly lost: 0 bytes in 0 blocks ==28846== possibly lost: 272 bytes in 1 blocks ==28846== still reachable: 0 bytes in 0 blocks ==28846== suppressed: 0 bytes in 0 blocks
上記に表示されているスレッドはメインの処理が終わった後も残り続けているのだと思うのですが、問題ないのでしょうか?
ご教示いただけますと幸いです。よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/19 05:01
2020/10/19 05:07
2020/10/19 05:14
2020/10/19 05:15
2020/10/19 05:18