F# の同時実行性にこの問題があります。これは私のコードの短縮版です (疑似コードによく似ています)。
それが行うことは、すべてのスレッドが実行を行う必要があるということです。つまり、ステータス<>待機が許可されている場合にのみ実行されます。すべてのスレッドには、実行が完了したときに実行を待機する独自の次のスレッドがあります。したがって、基本的に現在のスレッドが結果を返すと、次のスレッドにジョブを渡して実行を開始します。
type Test
// ... A BUNCH MEMBERS
// THIS IS THE MAIN ONE
member this.Running =
// (A): IF STATUS = WAITING -> WAIT UNTIL ALLOW TO RUN
lock this <| fun () ->
while this.GetStatus = Waiting do ignore(Monitor.Wait this)
Monitor.PulseAll this
// (B): EXECUTE RUNING
let result = this.DoRunning()
// (C): PASS WORK TO NEXT THREAD IN QUEUE
let nextThread = this.GetNextWaiter
nextThread.ChangeStatus()
// **PROBLEM: AT THIS POINT, THE THREAD THAT'S WAITING ABOVE
// SHOULD WAKE UP AND DO THE JOB I.E. EXECUTE RUNNING
// (D): RETURN RESULT OF THIS THREAD
result.Value
このコードの問題は、現在のスレッドが作業 (C) を次のスレッドに渡すとき (つまり、次のスレッドのステータスを待機以外のものに変更するとき)、その次のスレッドは ( A) を実行し、(B) からジョブの実行を開始します。
それを解決しようとする私の現在の試みは明るくありません。私がしているのは、 (D) の直前にnextThread
追加することで、メソッドが起動したときにメソッドを強制的に実行することです。nextThread.Running
この待機によって、スレッド自体と何らかの衝突が発生しました。
ウェイクアップ時に次のコードを実行する待機スレッドを作成する方法はありますか?