キャンセルポイントとは何ですか? 質問する

キャンセルポイントとは何ですか? 質問する

私は、C++ におけるキャンセル ポイントが正確に何であるかを理解しようとしています。私は以下を読みました:

マニュアルページそしてpthreadキャンセルポイントは何のために使用されるのか

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

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

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

ベストアンサー1

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

いわゆるブロッキングは、キャンセルの途中でスレッドに発生することがあります。

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

キャンセル手順の実行中、スレッドは OS が適切と判断した回数だけブロックされる可能性があります。

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

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

おすすめ記事