POSIX では、スレッド キャンセル タイプとしてPTHREAD_CANCEL_ASYNCHRONOUS
、およびPTHREAD_CANCEL_DEFERRED
( によって設定されるpthread_setcanceltype(3)
) いつpthread_cancel(3)
有効になるかを決定する 2 つのタイプが指定されています。私の読んだところでは、POSIX のマニュアル ページではこれらについてあまり説明されていませんが、Linux のマニュアル ページでは次のように説明されていますPTHREAD_CANCEL_ASYNCHRONOUS
。
スレッドはいつでもキャンセルできます。(通常、キャンセル依頼を受け次第すぐにキャンセルとなりますが、システム上保証するものではありません。)
システムがこれを保証するものではないという意味が気になります。これがマルチコア/マルチ CPU システム (コンテキスト スイッチの前) で発生していることは容易に想像できます。しかし、シングル コア システムはどうでしょうか。
pthread_setcancelstate(3)
キャンセルが要求され、キャンセルが有効 ( ) で、キャンセル タイプが に設定されている場合、スレッドをすぐにキャンセルしないようにすることはできPTHREAD_CANCEL_ASYNCHRONOUS
ますか?- はいの場合、これはどのような条件下で発生する可能性がありますか?
私は主に Linux (LinuxThreads / NPTL) に興味がありますが、より一般的には、このキャンセル ビジネスを POSIX 標準に準拠して表示する方法についても興味があります。
更新/明確化:ここでの実際の懸念事項はpthread_cancel()
、ターゲット スレッドでキャンセルが有効になっており、型に設定されている呼び出しの直後に破棄されるリソースの使用ですPTHREAD_CANCEL_ASYNCHRONOUS
!!! つまり、要点は次のとおりです。この場合、キャンセルされたスレッドが、コンテキストの切り替え後も (非常に短い時間でも) 正常に実行し続ける可能性はわずかにあるのでしょうか?
Damon の回答に感謝します。次のコンテキスト スイッチに関連するシグナルの配信と処理に関する質問が減りました。
Update-2:私は自分の質問に答えて、これは悪い懸念であり、根本的なプログラム設計は根本的に異なる概念レベルで対処する必要があることを指摘しました。この「間違った」質問が、非同期キャンセルの謎について疑問に思っている他の人にとって役立つことを願っています。