マルチスレッドで実行中のメソッドの内で、スレッドを終了させる方法


マルチスレッドで実行中のメソッド（voidメソッド）の内で、スレッドを終了させる方法がないか調査しています。

マルチスレッドの外側からならば、.Abort()でスレッドを強制終了することが出来るのですが、  
内側で自スレッドを終了させる方法がまだ分かっていません。

分かる方がいましたらご教授をお願いします。




> 内側で自スレッドを終了させる方法がまだ分かっていません。

該当メソッドから`return`することで、自スレッド処理を終了させることができます。

> マルチスレッドの外側からならば、`.Abort()`でスレッドを強制終了することが出来る

マルチスレッド・プログラム中で、あるスレッドから他スレッドを強制終了させる操作は、デッドロックやリソースリークを引き起こす危険性があります。よほどの特殊事情が無い限り、外部からの
**強制** 終了は避けるべきです。危険性に関する詳細は
[`Thread.Abort`メソッド](https://msdn.microsoft.com/ja-jp/library/ty8d3wta.aspx)
の解説も参照ください（個人的には、絶対に利用すべきでないというくらい危険視しています）。別スレッドの強制終了方法として、もうすこし挙動が穏やかな
[`Thread.Interrupt`メソッド](https://msdn.microsoft.com/ja-
jp/library/system.threading.thread.interrupt.aspx) も存在します。

安全に他スレッドを終了させるには、例えば「終了フラグ」のようなものを用意し、あるスレッドからは終了 **要求**
を出し、自スレッドでは定期的に該当フラグをチェックして自発的に終了するという実装方法がシンプルです。この設計は「Two-Phase
Terminationパターン」とも呼ばれます。

なお、C#ではこのような複数スレッドから同時に書き込み／参照が行われる変数を、`lock`構文などで排他制御するか`volatile`変数とする必要があります。




> 内側で自スレッドを終了させる方法がまだ分かっていません。

該当メソッドから`return`することで、自スレッド処理を終了させることができます。

> マルチスレッドの外側からならば、`.Abort()`でスレッドを強制終了することが出来る

マルチスレッド・プログラム中で、あるスレッドから他スレッドを強制終了させる操作は、デッドロックやリソースリークを引き起こす危険性があります。よほどの特殊事情が無い限り、外部からの
**強制** 終了は避けるべきです。危険性に関する詳細は
[`Thread.Abort`メソッド](https://msdn.microsoft.com/ja-jp/library/ty8d3wta.aspx)
の解説も参照ください（個人的には、絶対に利用すべきでないというくらい危険視しています）。別スレッドの強制終了方法として、もうすこし挙動が穏やかな
[`Thread.Interrupt`メソッド](https://msdn.microsoft.com/ja-
jp/library/system.threading.thread.interrupt.aspx) も存在します。

安全に他スレッドを終了させるには、例えば「終了フラグ」のようなものを用意し、あるスレッドからは終了 **要求**
を出し、自スレッドでは定期的に該当フラグをチェックして自発的に終了するという実装方法がシンプルです。この設計は「Two-Phase
Terminationパターン」とも呼ばれます。

なお、C#ではこのような複数スレッドから同時に書き込み／参照が行われる変数を、`lock`構文などで排他制御するか`volatile`変数とする必要があります。

