2016-03-18 22 views
0

スレッドセーフな方法で直ちに終了したいマルチスレッドC++ 03アプリケーション(Linuxベース)があります。スレッドセーフな方法でC++ 03でプログラムを終了するには?

私はexit(0)を使用しようとしましたが、これは他のスレッドが積極的に使用しているいくつかの静的変数を破壊し、解放されたメモリと破壊されたオブジェクトにアクセスし、明らかにexit()関数はデータ競合があります。「この関数を呼び出すと、静的持続時間を持つすべてのオブジェクトが破棄されます。複数のスレッドが実行されているプログラムでは、終了を呼び出せません(静的オブジェクトに影響しない同様の関数についてはquick_exitを参照してください)。

C++ 11はスレッドセーフのquick_exit()関数を提供します。しかし、私はこの大規模なアプリケーションを現時点でC++ 11に移行する能力はありません。

また、スレッドのクリーンターミネーション/ジョインをしようと努力したくありません。これは非常に複雑なプログラムであり、かなりの労力を要します。

他の選択肢はありますか?私はちょうどすぐに、クリーンアップ、コアダンプを終了するプログラムを終了します。

編集:私が実際にやっていることは、コアダンプを作成しないものでabort()呼び出しを置き換えることです。そして、abort()はスレッドセーフで、btwです。

+2

つまり、ショートカット(適切なシャットダウンロジックはありません)を受け取り、後悔しました。 – BitTickler

+1

恐らく 'kill(getpid()、SIGKILL);'? :) –

+1

サイドノート:多くの場合、シャットダウンコードの作成を避けるようです。彼らは時間を節約すると思っています。しかし、あなたはどのようにしてプログラムにvalgrindのようなツールを動かすのですか? – BitTickler

答えて

3

あなたは_exit(status)(先頭にアンダースコアに注意)

ドキュメントを呼び出すことによって、あなたが望む効果が得られます:あなたが終了したいのか明確ではない

http://man7.org/linux/man-pages/man2/_exit.2.html

0

を:プロセスまたはスレッド。通常、プロセスを終了してOSに制御を戻すのは安全ですが、通常は「ブルートフォース」でスレッドを終了させることは悪い考えです。理由は多くのコードとライブラリは、単一のスレッド環境で実行されているという前提で書かれています。スレッドを強制終了すると、いくつかのグローバル変数が「量子状態」に残り、他のスレッドで実行されているコードに問題が発生します。上記のコードでいくつかの場所を見つけ、それを丁寧に "尋ねる"ためにあなたの努力を払う方が良いでしょう。

+0

スレッドを処理するのではなく、プロセスを終了します。明快さの欠如のために申し訳ありません。 – jfritz42

関連する問題