2

関数、およびを使用して、 Lwtで特定のディレクトリからプロセスを開始するのは簡単です。Sys.getpwdLwt_unix.chdirLwt_process.exec

  1. 現在の作業ディレクトリSys.getpwdを保存するために使用します
  2. Lwt_unix.chdir特定のディレクトリに移動するために使用します
  3. Lwt_process.exec外部プロセスの開始に使用
  4. Lwt_unix.chdir保存された現在の作業ディレクトリに移動するために使用します

このロジックには欠陥があります。スケジューラが への最初の呼び出しのLwt_unix.chdir後、および への呼び出しの後に別のスレッドを実行できるため、保存された現在のディレクトリではなく特別なディレクトリLwt_process.execでこのスレッドが実行されるからです。私が説明したような競合状態を導入することなく、 Lwtを使用して特別なディレクトリからプロセスを簡単に開始することは可能ですか?

4

1 に答える 1

2

などの同期プリミティブを使用して、現在の作業ディレクトリを保護できますLwt_mutex。ただし、次のチェーンがあるとします。

lock dir_guard >> chdir dir >> exec proc >> chdir dir' >> unlock dir_guard

これにより、プロセスがタスクを実行している間ずっとディレクトリを変更できなくなりprocます。これは、慎重すぎて不必要かもしれません。次のコードには、この問題はありません。

let exec_in_folder guard dir proc = 
  with_lock guard (fun () -> 
     chdir dir >>= fun () -> return (exec proc)) >>= fun proc_t ->
  proc_t

ただし、このコードには問題があります。プロセスがアトミックに開始される場合、つまり、プロセス開始手順中に何らかの再スケジュールが行われる可能性がない場合にのみ正しいです。これにより、他のスレッドが干渉して現在の値を変更できるようになります。フォルダ。それがアトミックであることを証明するために、ソースを読むか、そのような保証を持つ独自のプロセスを開始して実装することができます。コードを読むと、そのプロセスはspawn関数で作成され、その瞬間はfork散在するスレッドなしで実行されることがわかります。はい、このコードは正しいです。

于 2015-06-16T13:35:41.540 に答える