9章キャンセルとタイムアウト
対話的なアプリケーションでは、あるスレッドが特定の条件のもとで、実行中の他のスレッドに割り込むことが重要な場合があります。以下に、このような振る舞いの例を挙げます。
- ユーザがウェブブラウザでストップボタンをクリックすると、ブラウザは、ページをダウンロードするスレッド、ページを描画するスレッド、スクリプトを走らせるスレッドなど複数の動きに割り込みをかける必要が生じます。
- 典型的なサーバは、クライアントが要求を出すために必要な時間を割り当て、その時間が経過したら接続を閉じます。そうすることで休止している接続がリソースを使い切るのを回避します。
- ユーザインタフェースと重い計算(例えば、データの可視化など)とを別々のスレッドにしているアプリケーションではユーザがユーザインタフェースを通じてパラメータを変更したときに、計算に割り込みをかける必要があります。
キャンセルを実現するために設計上重要なのは、キャンセル対象がキャンセル条件をポーリングするようにするか、該当スレッドを何らかの方法で直接キャンセルするかを決めることです。両者はトレードオフの関係にあります。
- ポーリングが必要だとすると、プログラマが定期的にポーリングするのを忘れたために、スレッドが無応答になるという危険があります。そうなってしまうと、ずっと無応答のままになるでしょう。無応答スレッドが発生すると、ハングアップやデッドロックを引き起こします。これはユーザから見れば、かなり不快なことです。
- キャンセルが非同期で起こるとすると、状態を変更するクリティカルセクションはキャンセルから保護する必要があります。さもなければ、キャンセルが発生するとデータの一部に不整合が発生する中途半端な更新が発生してしまいます。 ...
Get Haskellによる並列・並行プログラミング now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.