0

我在 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) 开始执行作业。

我目前解决它的尝试并不乐观。我所做的是nextThread在方法被唤醒时强制运行该方法,方法nextThread.Running是在 (D) 之前添加。通过这个等待,线程本身发生了一些冲突。

有什么办法可以让等待线程在唤醒时执行以下代码?

4

0 回答 0