私は複数のスレッド(pthreads)を持つプログラムを実装していますが、私はいくつかの点で助けを求めています。私はLinuxでC++をやっています。私の他の質問はすべてこれまでのところGoogleによって回答されていますが、回答が見つからなかったのはまだ2つあります。マルチスレッドとアトミック/ memリーク
質問1:スレッドI/OとWebページの取得/処理をスレッド内で行う予定です。スレッドが原子的であることを保証するには、とにかくありますか?私はかなり長い間私のプログラムを実行させようとしていますが、実際にはあらかじめ決められた終了点がありません。私はctrl + cからシグナルをキャッチするつもりです。後でいくつかのクリーンアップを行いたいのですが、私のプログラムが結果/クローズファイルなどを出力したいのです。
私はそれが妥当な振る舞いプログラムがスレッドが完了するのを待つか、すべてのスレッドを終了させるか、ファイルを閉じて終了するかを選択します。私は私の結果が歪曲することを望んでいません。私はシグナル捕捉メソッドでpthread_exit()を行うべきですか?
これに関する他のコメントやアイデアはいいと思います。
質問2:Valgrindはメモリリークの可能性があると言っています。これらは避けられますか、これは常にC++のスレッドで起こりますか?以下は、valgrindで確認するときに得られる6つのメッセージのうちの2つです。
私はいくつかの異なるウェブサイトを見てきました。ある人は、スレッドをスリープ状態にしている可能性があるため、メモリリークの可能性があると言いました。それは私には意味がありませんが、私は現在、私が現在行っているセットアップをテストするためにスレッドをスリープ状態にしています(実際にスレッドを再生している現実のI/Oは実際に行っていません)。
==14072== 256 bytes in 1 blocks are still reachable in loss record 4 of 6
==14072== at 0x402732C: calloc (vg_replace_malloc.c:467)
==14072== by 0x400FDAC: _dl_check_map_versions (dl-version.c:300)
==14072== by 0x4012898: dl_open_worker (dl-open.c:269)
==14072== by 0x400E63E: _dl_catch_error (dl-error.c:178)
==14072== by 0x4172C51: do_dlopen (dl-libc.c:86)
==14072== by 0x4052D30: start_thread (pthread_create.c:304)
==14072== by 0x413A0CD: clone (clone.S:130)
==14072==
==14072== 630 bytes in 1 blocks are still reachable in loss record 5 of 6
==14072== at 0x402732C: calloc (vg_replace_malloc.c:467)
==14072== by 0x400A8AF: _dl_new_object (dl-object.c:77)
==14072== by 0x4006067: _dl_map_object_from_fd (dl-load.c:957)
==14072== by 0x4007EBC: _dl_map_object (dl-load.c:2250)
==14072== by 0x40124EF: dl_open_worker (dl-open.c:226)
==14072== by 0x400E63E: _dl_catch_error (dl-error.c:178)
==14072== by 0x4172C51: do_dlopen (dl-libc.c:86)
==14072== by 0x4052D30: start_thread (pthread_create.c:304)
==14072== by 0x413A0CD: clone (clone.S:130)
私は私のスレッドを作成しています:(RC =リターンコード)
rc = pthread_create(&threads[t], NULL, thread_stall, (void *)NULL);
。エントリーポイントの終わりに、私はpthread_exit()を呼び出します。ここで
はい、正しくプログラミングすることでメモリリークを回避できます。そのような面ではすべてのライブラリが完璧なわけではなく、外部ライブラリからのエラーを無視したいかもしれません。また、「まだ到達可能」は実際には「リーク」ではなく、「怠け者」である。 (それがなぜ外部の図書館にあるのか説明しています)。漏れは「間違いなく失われた」ものです。 –
コメントありがとうございます。私がスレッドを再起動する前にスレッドに参加していなかったため、多くの「まだ到達可能な」メモリがありました。 – Risshuu