私はコマンドx
を取る関数Haskellでどのようにフォークのtry-catchを実装できますか?
forkos_try :: IO (Maybe α) -> IO (Maybe α)
を書きたいです。 x
は、最初に状態を変更し、その状態が乱れているかどうかを確認する命令的な操作です。 (これは、状態を元に戻すためにOSレベルのサンドボックスのいくつかの種類を必要とする外部の何かを、行いません。)
x
はJust y
、forkos_try
戻りJust y
に評価された場合。それ以外の場合はforkos_try
ロールバック状態となり、Nothing
を返します。
内部的には、x
とスレッドparent
とchild
にfork()
は、child
上で動作している必要があります。
x
が成功した場合、child
は(x
の結果を返す)とparent
は(Nothing
を返す)を実行しておく必要がありそう- 、
parent
を死ぬべきで、child
が
質問を死ぬ必要があります実行し続ける必要があります:forkos_try
と同等以上の強力なセマンティクスで何かを書く方法はありますか? N.B. -(x
による)の状態は、外部ライブラリにあり、スレッドの間を渡すことはできません。したがって、どのスレッドが生き続けるのかという意味は重要です。
正式には、「継続して実行する」とは、「continue continuity rest :: Maybe α -> IO()
を実行する」という意味です。しかし、その継続はコード内のどこにでも明示されません。私の場合のために
rest
の明示的な式を書くことができるので、(実行される計算全体
child
を取る)
forkOS
を使用して、異なるスタイルでそれを書くために働くだろうと思います。しかし、それは私がどのようにプリミティブ関数
forkOS
でこれを行うのか分からないという問題を抱えています。特定のケース(
forkos_try
のような高水準APIとして表示される可能性があります)をサポートするのに十分一般的だと思います。
EDIT - 問題は、[http://pastebin.com/nJ1NNdda]まだはっきりしていない場合は、明示的なrest
とのコード例を参照してください。
p.s.私はしばらくの間に並行コードを書いていません。 POSIX fork()
の私の知識がうまくいけばうれしいです!前もって感謝します。
ここには初心者向けの実装が明示的に続きます:http://pastebin.com/nJ1NNdda – gatoatigrado
質問の理解に問題があります。状態はIOモナドにあるように見えますが、一般的には実行できないため(たとえば、ミサイルをいくつか起動したなど)、状態をロールバックする方法はありますか? –
私は、OPがOSレベルのフォーク(つまり、 'forkIO'ではなく)を使用したいと思っています。これにより、 'IORef'のような内部状態をすべてロールバックすることができます。もちろん、ファイルに書き込まれたものをロールバックすることはできません。 – nominolo