1

私のプログラムはスタックスマッシングが検出されて失敗し、Valgringからのメッセージは、「ブロックが損失レコードで失われる可能性があります」というメッセージが3回繰り返され、解決方法がわかりません。

==3726== 144 bytes in 1 blocks are possibly lost in loss record 74 of 87
==3726==    at 0x4025315: calloc (vg_replace_malloc.c:467)
==3726==    by 0x4010CD7: allocate_dtv (dl-tls.c:300)
==3726==    by 0x401146B: _dl_allocate_tls (dl-tls.c:464)
==3726==    by 0x40405C6: pthread_create@@GLIBC_2.1 (allocatestack.c:570)
==3726==    by 0x806BF36: Thread::Thread(void* (*)(void*), void*) (os.cpp:203)

これはコードであり、Valgrindはpthread_create呼び出しです。

Thread::Thread( PFUNC func, void * arg )
{
    int s = pthread_create( &_ThreadId, NULL, func, arg);  //here is msg from valgrind

    if (s != 0)
            throw EXCEPT_NOTHREAD;

    pthread_detach( _ThreadId ); 

}

スレッド機能の何が問題になっているのか教えてください。スレッドを作成する前にpthread_detachが必要であるという他の同様の質問を読みましたか?よろしくお願いします。

4

1 に答える 1

5

スレッド機能の何が問題になっているのか教えてください。

そのような「間違った」ものは何もありません。プログラムが終了する前にスレッドのリソースを解放していないだけであり、Valgrindはこれをメモリリークとして報告しています。スレッドを切り離したので、スレッドが終了するまでそのリソースは解放されません。プログラムが終了する前に終了しない場合は、リークとして報告される可能性があります。

スレッドを作成する前にpthread_detachが必要であるという他の同様の質問を読みましたか?

使用する必要はありませんpthread_detach; これは、スレッドが自身のリソースを解放する責任を負うようにするために使用されます。使用しない場合はpthread_join、スレッドを停止するときに別のスレッドを呼び出す必要があります。

_ThreadIdリークをクリーンアップする場合は、スレッドを切り離す代わりに、スレッドハンドルを保持する必要があります(メンバー変数であると仮定すると、すでに実行していると思います)。次に、プログラムが終了する前に、スレッドに停止するように指示してから、呼び出してプログラムpthread_joinを待機し、すべてのリソースを解放します。(おそらく無害な)警告を削除するためにそれを行うのが面倒な価値があるかどうかはあなた次第ですが、クリーンなシャットダウンは、より深刻な潜在的な問題を回避するのに役立つ可能性があります。

ちなみに、大文字_ThreadIdで始まるような名前は使用しないでください_。そのような名前は予約されています。

于 2012-10-05T23:52:35.177 に答える