我在 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) 之前添加。通过这个等待,线程本身发生了一些冲突。
有什么办法可以让等待线程在唤醒时执行以下代码?