F#locking - 线程唤醒但不继续其工作

时间:2013-10-31 04:47:08

标签: multithreading concurrency f#

我在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来运行该方法。通过这种等待,线程本身发生了一些冲突。

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

0 个答案:

没有答案