我在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
在唤醒它时通过在(D)之前添加nextThread.Running
来运行该方法。通过这种等待,线程本身发生了一些冲突。
有什么方法可以让等待线程在唤醒时执行以下代码?