C++ で独自のキャンセル ポイント メカニズムを実装しようとしています。このコードは主に Linux を対象としていますが、POSIX システム間で移植できることを願っています。
明らかな理由から、すべてのブロック システム コールはキャンセル ポイントである必要があります。そうしないと、スレッドが永久にブロックされ、スレッドを起動することができなくなります。現在、私はそれを達成するためにシグナルを使用しています。スレッドがキャンセル要求を表す特別なシグナルを受信すると、シグナル ハンドラーはスレッド ローカル フラグを設定します。そのスレッドが何らかのシステム コールでブロックされている場合、 で失敗しerrno == EINTR
ます。その後、フラグを確認する機会があります。
しかし、すぐに上記の方法が完璧ではないことがわかりました。シグナルが最初に来て、スレッドがブロッキング システム コールに入ると、同様に永久ブロッキングに入ります。各ブロッキング呼び出しの前にフラグをチェックするだけでは十分ではありません。チェックの直後にシグナルが来る場合があります。
if(cancelled)
throw CancellationException();
// <--- The signal comes here. ---> //
blocking_call();
ここに私の問題があります: システムコールに入ったときに、キャンセルフラグが設定されていないことを確認する方法はありますか? そうでない場合、そのようなキャンセルポイントを設計する一般的な方法は何ですか?