web-dev-qa-db-ja.com

キャンセルポイントとは正確には何ですか?

私はc ++のキャンセルポイントが正確に何であるかについて頭を悩ませようとしています。読みました:

マニュアルページ および pthreadキャンセルポイントの用途

しかし、私はまだ特定の点で少し混乱しています。たとえば、ファイルのwrite()関数を使用しています。どうやらこれはキャンセルポイントです。したがって、write()を呼び出すと、別のスレッドが処理を開始する可能性があることがわかります(したがって、コードが書き込みスレッドから別のスレッドに切り替わります)。これは通常、書き込みバッファーがいっぱいで、書き込み前に空にする必要がある場合に発生します。 ()は成功/完了できます。

しかし、私の考えでは、これはスレッドのキャンセルではなく、一時的なブロック/一時停止であり、スレッドの「クリーンアップ」を行う必要はありません...

だから私の質問は、キャンセルポイントは「ブロッキングポイント」と関係がありますか? -本当に同じものですか、それとも違いがありますか?キャンセルポイントが何であるかについての明確な「トップレベル」の説明は、本当に役に立ちます。

16
code_fodder

スレッドが実行からプルされると、その状態はOSによって保存され、スレッドのキャンセルではありません。キャンセルとは、要求に応じて、完了時にすべてを最終状態にするという特定の目的でスレッドを終了することを意味します(つまり、すべてのリソースが解放され、すべてのハンドラーが更新されます)。

ブロッキングと呼ばれるものは、キャンセルの途中でスレッドに発生する可能性があります。

例:スレッドはキャンセル要求を受け取ります。 OSは、スレッドがキャンセル可能になるまでキューに入れます。スレッドがキャンセル可能になり、スレッドがキャンセルポイントを実行している場合、スレッドをクリーニングしてキャンセルできます。 write関数はキャンセルポイントです。つまり、OSの観点からは、この関数の実行中にスレッドをキャンセルしても安全です(関連するすべてのリソースの状態は一貫しています)。

キャンセル手順の実行中は、OSが適切と思われる回数だけスレッドをブロックできます。

補足として、キャンセルポイントのPOSIX要件を見ると、事実上すべてのブロッキングインターフェイスがキャンセルポイントである必要があります。そうしないと、(そのような呼び出しで)完全にブロックされたスレッドで、そのスレッドを終了する安全な方法がありません。

http://man7.org/linux/man-pages/man7/pthreads.7.html

16
Bogdan V.

pthread_cancel()を使用して別のスレッド(メインスレッドなど)のスレッドを終了またはキャンセルする場合、次のことが起こります( c.f。 ):

pthread_cancel()関数は、キャンセル要求をスレッドthreadに送信します。

ターゲットスレッドはすぐには終了しませんが、キャンセルポイントc.f。 )に到達したときに終了します。

POSIX.1は、特定の機能がキャンセルポイントである必要があり、特定の他の機能がキャンセルポイントである可能性があることを指定しています。スレッドがキャンセル可能であり、そのキャンセル可能性タイプが延期され、スレッドのキャンセル要求が保留中の場合、スレッドは、キャンセルポイントである関数を呼び出すとキャンセルされます。

キャンセルポイントであるこれらの関数がスレッドの実行もブロックする可能性があるかどうかは、現時点では関係ありません。ドキュメントには、これらの関数のリストがあります。

簡単にするためにここで省略したスレッドの動作と「キャンセル可能性」に影響を与える可能性のある設定があることに注意してください。さらに読むために:

13
moooeeeep