時々キャンセルされる複数のスレッドを実行するアプリケーションがあります。これらのスレッドは、リソース (ソケット) に内部的にアクセスする別のオブジェクトを呼び出す場合があります。リソースが同時にアクセスされるのを防ぐために、実行時に何らかの順序を取得するためのクリティカル セクションがあります。
ここで、スレッドをキャンセルすると、スレッドがクリティカル セクションによってブロックされているコード内にあることが (時々) 発生します。クリティカル セクションはオブジェクトを使用してロックされており、スレッドのキャンセル時にこのオブジェクトが破棄され、その結果ロックが解除されることを期待していました。ただし、これは当てはまらないようで、スレッドの破棄時にこのリソース オブジェクトは永久にロックされます。
リソース オブジェクトを変更することはおそらくオプションではありません (サード パーティが提供)。さらに、並列で使用できないリソースへの同時アクセスを防止することは理にかなっています。
セクションがロック/ロック解除されているときに pthread_setcancelstate を使用してスレッドがキャンセルされないように実験しましたが、これは少し汚れているように感じ、他の状況 (たとえば、買収されたミューテックスなど) の最終的な解決策にはなりません。
好ましい解決策は、pthread_cancel を使用せず、代わりにスレッドにフラグを設定することであり、準備ができたときに (クリーンな方法で) スレッド自体をキャンセルすることを私は知っています。しかし、私はスレッドをできるだけ早くキャンセルしたいので、それを行う他のオプションがあるかどうか疑問に思っていました.