2012-02-15 3 views
0

私は複数のスレッド(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()を呼び出します。ここで

+0

はい、正しくプログラミングすることでメモリリークを回避できます。そのような面ではすべてのライブラリが完璧なわけではなく、外部ライブラリからのエラーを無視したいかもしれません。また、「まだ到達可能」は実際には「リーク」ではなく、「怠け者」である。 (それがなぜ外部の図書館にあるのか説明しています)。漏れは「間違いなく失われた」ものです。 –

+0

コメントありがとうございます。私がスレッドを再起動する前にスレッドに参加していなかったため、多くの「まだ到達可能な」メモリがありました。 – Risshuu

答えて

0

が私の感想です:

あなたのスレッドが正常に終了したい1.If(開いているファイルやソケットハンドルでそれらを殺すことは決して良いアイデアではありません)、それらに終了フラグにループしている:

while(!stop) 
{ 
    do work 
} 

その後、ctrl-cをキャッチすると、フラグがtrueに設定され、それらに参加します。 std::atomic<bool>として停止を宣言して、すべてのスレッドが更新された値を参照するようにしてください。この方法では、現在の作業のバッチを終了し、次回に状態を確認するときに正常に終了します。

2.これに答えるためのコードに関する十分な情報がありません。

関連する問題