延期されたキャンセルポイントを使用できます。スレッドで使用しますpthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldstate);(これはデフォルトですが、明示的にすることは決して害にはなりません)。pthread_setcancelstate次に、キャンセル可能にするための条件変数待機を除いて、キャンセルを無効にします。pthread_cleanup_push必ずキャンセルクリーンアップハンドラーの設定に使用してください。これはRAIIではうまく機能しません。
そして今、あなたはあなたのスレッドをpthread_cancelすることができます。キャンセルクリーンアップハンドラーが登録の逆の順序で実行され、TLSデータデストラクタが呼び出され、スレッドが終了します(条件変数waitから戻ることなく)。
もちろん、これはかなり醜いデザインです。理想的には、デッドロックをまったく回避する必要があります。それが不可能な場合、それが私である場合、一度に1つのcvarでブロックするスレッドを1つだけ配置し、複数のcvarを処理するために、これらのcvarに基づいてより高いレベル(明示的なウェイターリスト)の構成を構築します。ウェイターは、スレッドを個別にアドレス指定できるようにします。