問題タブ [cancellation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
774 参照

c - ユーザー空間にキャンセル可能なシステムコールを実装する

私は、他の最近の質問で説明した「不快な動作」(バグと言う人もいるかもしれません) なしで、Linux に pthread キャンセルを実装することに取り組んでいます。これまでの pthread キャンセルに対する Linux/glibc のアプローチは、これをカーネル サポートを必要としないものとして扱い、syscall を行う前に非同期キャンセルを有効にし、以前のキャンセル状態を復元することによって純粋にライブラリ レベルで処理できるものとして扱ってきました。システムコールが戻った後。これには少なくとも 2 つの問題があり、そのうちの 1 つは非常に深刻です。

  1. キャンセルは、syscall がカーネル空間から戻った後、ユーザー空間が戻り値を保存する前に実行できます。これにより、syscall がリソースを割り当てた場合にリソース リークが発生し、キャンセル ハンドラを使用してリソースにパッチを適用する方法がありません。
  2. キャンセル可能な syscall でスレッドがブロックされている間にシグナルが処理される場合、シグナル ハンドラー全体が非同期キャンセルを有効にして実行されます。これは、シグナル ハンドラーが async-signal-safe であるが async-cancel-safe ではない関数を呼び出す可能性があるため、非常に危険な場合があります。

問題を解決するための最初のアイデアは、非同期キャンセルを有効にするのではなく、スレッドがキャンセル ポイントにあるというフラグを設定することでした。このフラグが設定されている場合は、キャンセル シグナル ハンドラーが保存された命令ポインターをチェックして、それが次を指しているかどうかを確認します。 syscall 命令 (アーキテクチャ固有)。その場合、これは syscall が完了していないことを示しており、シグナル ハンドラが戻ったときに再開されるため、キャンセルできます。そうでない場合は、システムコールが既に返されていると想定し、キャンセルを延期しました。ただし、競合状態もあります。スレッドがまだ syscall 命令にまったく到達していない可能性があります。その場合、syscall がブロックされ、キャンセルにまったく応答しない可能性があります。もう 1 つの小さな問題は、シグナル ハンドラから実行されたキャンセル不可能なシステムコールが誤ってキャンセル可能になったことです。

私は新しいアプローチを検討しており、それに関するフィードバックを探しています。満たさなければならない条件:

  • syscall の完了前に受け取ったキャンセル要求は、syscall がかなりの時間ブロックする前に処理する必要がありますが、シグナル ハンドラによる中断により再起動が保留されている間は処理しないでください。
  • syscall の完了後に受け取ったキャンセル要求は、次のキャンセル ポイントまで延期する必要があります。

私が念頭に置いているアイデアには、キャンセル可能なシステムコール ラッパー用の特別なアセンブリが必要です。基本的な考え方は次のとおりです。

  1. 次の syscall 命令のアドレスをスタックにプッシュします。
  2. スタック ポインターをスレッド ローカル ストレージに格納します。
  3. スレッド ローカル ストレージからキャンセル フラグをテストします。設定されている場合、ルーチンをキャンセルするためにジャンプします。
  4. システムコールを行います。
  5. スレッド ローカル ストレージに保存されているポインターをクリアします。

キャンセル操作には、次のものが含まれます。

  1. ターゲット スレッドのスレッド ローカル ストレージにキャンセル フラグを設定します。
  2. ターゲット スレッドのスレッド ローカル ストレージでポインターをテストします。null でない場合は、ターゲット スレッドにキャンセル シグナルを送信します。

キャンセル シグナル ハンドラは次のようになります。

  1. 保存されたスタック ポインター (シグナル コンテキスト内) が、スレッド ローカル ストレージ内の保存されたポインターと等しいことを確認します。そうでない場合は、キャンセル ポイントがシグナル ハンドラーによって中断されており、現在何もする必要がありません。
  2. プログラム カウンター レジスタ (シグナル コンテキストに保存されている) が、保存されているスタック ポインターに保存されているアドレス以下であることを確認します。もしそうなら、これはシステムコールがまだ完了していないことを意味し、キャンセルを実行します。

これまでに見た唯一の問題は、シグナル ハンドラーのステップ 1 にあります。動作しないと決定した場合、シグナル ハンドラーが戻った後、保留中のキャンセル要求を無視して、スレッドが syscall でブロックされたままになる可能性があります。これには、次の 2 つの解決策が考えられます。

  1. この場合、タイマーをインストールして特定のスレッドにシグナルを配信し、基本的には運が良くなるまでミリ秒ごとに再試行します。
  2. キャンセル シグナルを再度発生させますが、キャンセル シグナルのマスクを解除せずにキャンセル シグナル ハンドラーから戻ります。中断されたシグナルハンドラーが戻ると、マスクは自動的に解除され、再試行できます。ただし、これはシグナル ハンドラ内のキャンセル ポイントの動作に干渉する可能性があります。

どのアプローチが最適か、または私が見逃している他のより根本的な欠陥があるかどうかについて何か考えはありますか?

0 投票する
1 に答える
1084 参照

c# - CancellationTokenSourceおよびCancellationTokenパターンに類似したスレッドを一時停止するためのパターン?

フレームワーク4.0でConcellationTokenSourceとCancellationTokenによって提供される協調スレッドキャンセルパターンを使い始めましたが、非常に便利でシンプルであることがわかりました。

私の目的は、アプリケーションに同様のエレガントでシンプルなソリューションを提供することですが、スレッドをキャンセルするのではなく一時停止することです。この場合も、要求は一時停止コマンドのリッスンとは異なるため、PauseTokenSourceやPauseTokenのようなものがあるとよいと思いました。ですから、私の最初の質問は、協調的な一時停止のためにそのようなパターンを提案するのか、それとも他の何かより良いのかということです。

そのようなパターンを持つのが良い考えであるならば、それを行う方法について何か提案やガイドラインはありますか?現時点では、ソースはManualResetEventによって一時停止および一時停止を解除できる必要があり、トークンにはソースへの参照が含まれている必要があると思いました。それはあなたがそれを改善するための提案を私に与えることができることを願っている最初の草案に続く。

0 投票する
1 に答える
97 参照

http - ユーザーがリクエストをキャンセルした場合、一般的な Web サーバーは何をしますか?

それほど短期間ではないリクエストで、ユーザーが接続をキャンセルした (つまり、リクエストが完了する前にブラウザを閉じた) 場合、サーバー側で何が起こるでしょうか?

ただし、サーバーに依存する必要があります。しかし、一般的な方法は何でしょうか?

一部の要求は、完了するまでにかなり長い時間がかかります。たとえば、分散 DBMS トランザクションでは、データが異なる国の複数の異なるサーバーにコミットされます。(銀行の申し込みではよくあることだと思います)

たとえば、ユーザーが大きな添付ファイルをダウンロードする場合など、一部の要求はクライアントに大量のデータを送信します。

特定のタイムアウト後にリクエストスレッドをキャンセルする必要がありますか?

私の Web アプリケーションがユーザー アクティビティを処理し、次のように自分でトランザクションをキャンセルする必要があります。

するべきか?

0 投票する
2 に答える
9957 参照

android - Android エコー キャンセル

Android APIのAudioRecordクラスを使用してオーディオキャプチャアプリケーションを開発しようとしています.MediaRecorder.AudioSource.MICのオーディオソースを設定しますが、エコーキャンセルを使用しようとするとMediaRecorder.AudioSource.AudioSourceを設定します. VOICE_COMMUNICATION ソース、AudioRecorder オブジェクトが作成されると、IllegalArgumentException がスローされますが、理由はわかりません。

私のコードは次のとおりです。

私のAndroidマニフェストには次のものがあります:

uses-permission android:name="android.permission.RECORD_AUDIO"

おそらく、私は Samsung Galaxy Tab p1000 を使用していて、Android 2.2 で実行されているためでしょうか? 何か案が?

どうもありがとう

0 投票する
6 に答える
17288 参照

java - SwingWorker の実行をキャンセルするにはどうすればよいですか?

現在、バックグラウンドでジョブを実行している 2 つの SwingWorker スレッドがあります。例外が発生した場合、メソッドは動作を停止しますが、スレッドは引き続き実行されます。

doInBackground()例外が発生した場合、実行を停止してスレッドを強制終了するにはどうすればよいですか?

this.cancel(true)スレッドを破棄/閉じないでください。どうすればこれを達成できますか?

これらのスレッドは、Netbeans のデバッグで確認できます。

0 投票する
6 に答える
17431 参照

java - SwingWorker:正確にdoneメソッドと呼ばれるのはいつですか?

done()のメソッドのJavadocSwingWorker:

doInBackgroundメソッドが終了した後、イベントディスパッチスレッドで実行されます。

キャンセルされた労働者の場合、それは真実ではないという手がかりがあります。
Doneはそれぞれの場合(通常の終了またはキャンセル)に呼び出されますが、通常の終了の場合と同様に、EDTにエンキューされていないcancelled場合に呼び出されます。

doneaSwingWorkerがキャンセルされた場合に、が呼び出されたときのより正確な分析はありますか?

明確化:この質問は、どのようにするかではありません。ここでは、が正しい方法でキャンセルされていると想定しています。 そして、それは、スレッドが終了することになっているときにまだ機能しているということではありません。cancelSwingWorkerSwingWorker

0 投票する
2 に答える
877 参照

android - Android アプリの購入がキャンセルされた理由をフィードバックしてください。

私は最初の Android アプリを公開しましたが、iPhone とはまったく異なります。

一部の Android アプリの購入で、注文がキャンセルされました。注文を確認すると、「電話からキャンセルがリクエストされました」という理由が表示されます。

画面の左上隅に購入者のメール連絡先があるので、キャンセルしたのにフィードバックがない人にメールを送信しました。

このような場合にフィードバックを得るには、これが正しい方法ですか? キャンセルの理由はどうすればわかりますか?場合によっては購入処理に問題があることに気付きました (友人にアプリの購入を依頼しました) - これは頻繁に発生し、キャンセルの主な原因ですか?

どうもありがとう...

0 投票する
1 に答える
2497 参照

c# - 複数のソースによるタスクのキャンセル

私は現在、次々に実行される一連のタスクを作成するアプリケーションを持っており、タスク間の実行を中断できるキャンセル ソースを使用します (つまり、安全な終了ポイントで)。現在、このキャンセル ソースは、管理クラスが Disposed の場合にのみ使用します。 、クリーンかつ迅速に実行を中止する方法として。

オペレーターがタイムリーに応答しない場合に備えて、自動タイムアウトを作成してタスク シーケンスをキャンセルするユース ケースがあります (一部のタスクは、物理メカニズムとのオペレーターの対話を待機します)。同時に、管理クラスが Disposed の場合はキャンセルをサポートする必要があります。CancellationTokenSource.CreateLinkedTokenSourceを見つけました。これは必要なように思えますが、いくつか懸念事項があります。

  1. 複数のタスク シリーズを並行して実行できるため、タイムアウトのキャンセル用に新しい CancellationTokenSource を作成し、開始する各タスク シリーズに関連するリンクされたソースを作成する必要があります。CancellationTokenSource は IDisposable を実装しています。つまり、最後のタスクが完了したとき、またはサブタスクのいずれかが Canceled または Faulted になったときに、両方のキャンセル ソースを保持して Dispose する必要があります。これは、匿名メソッド クロージャの便利な魔法を使用しても、かなりぎこちないように思えます (これらのキャンセル ソースはまだ渡されています)。

  2. また、タイマーが切れる前にキャンセル ソースが破棄される状態から保護する必要があります (したがって、破棄されたソースをキャンセルしません)。これは競合状態になる可能性があるため、適切なロックを追加する必要があります。これも厄介なようで、かなりの複雑さ (将来のメンテナンス コスト) が追加され、単体テストがより困難になります (競合状態を確実に誘発するのは難しいです)。

ここで正しい道を進んでいますか、それとももっと簡単な方法がありますか?

0 投票する
1 に答える
972 参照

linux - 別のスレッドの pthread キャンセル タイプを変更しますか?

私が達成したいのは、メイン スレッドが最初にワーカー スレッドで通常の遅延キャンセルを試行し (私の目的ではブラック ボックスであるコードを実行する)、次にスレッドがまだタイムアウト後も実行されている場合 ( pthread_timedjoin_np())、非同期キャンセルを行います。私が抱えている問題はpthread_setcanceltype()、呼び出し元のスレッドのみです。これを可能にする回避策やハックはありますか? 少なくともLinuxでは、非同期キャンセルがスレッドのオブジェクトのC++デストラクタを実行するように見えるため、シグナルの使用を避けたいと思います。これは私にとって重要です。

0 投票する
1 に答える
4255 参照

c# - CancellationToken で LINQ を使用する適切な方法

CancellationToken.NET フレームワークで提供されるメカニズムを使用してキャンセルをサポートする LINQ クエリを作成しようとしています。ただし、キャンセルと LINQ を組み合わせる適切な方法が何であるかは不明です。

PLINQ を使用すると、次のように記述できます。

残念ながら、 - にWithCancellation()のみ適用されるParallelEnumerableため、単純な古い LINQ クエリでは使用できません。もちろん、 を使用WithDegreeOfParallelism(1)して並列クエリを順次クエリに変換することは可能ですが、これは明らかにハックです。

Taskまた、いくつかの場所でこれを行う必要があり、場合によってはこのコードが実行されるスレッドを制御できる必要があるため、この操作用に別のを作成することも避けたいと思います。

それで、私自身の実装を書くWithCancellation()ことはできませんが、同じことを達成する代替手段はありますか?