2013-02-25 38 views
0

上(還Erlang's mailing list可用。)讓「每一個過程運行,直到它被阻止」一個Erlang節點

是否有可能寫等待一個Erlang節點上運行的每個進程的功能以達到一個點,它被阻止,等待消息?

該函數只有在每個進程正在等待尚未發送給它的消息時纔會返回。假設沒有進程處於與時間相關的暫停狀態(接收到後續句子,與計時器相關的操作等)。運行此功能的過程當然不包括在內。

明顯錯誤的答案:

erlang:yield/0:這給出了一個機會,所有其他進程運行,但不一定,直到它被阻止。

回答

0

不是100%正確的做法:

only_one_not_waiting() -> 
    Running = 
    [P || P <- processes(), process_info(P, status) =/= {status, waiting}], 
    length(Running) == 1 
end. 

everyone_blocked() -> 
    case only_one_not_waiting() of 
    true -> ok; 
    false -> everyone_blocked() 
    end. 

忽略定時器,運行only_one_not_waiting/0反覆,直到它返回true(如everyone_blocked/0一樣)應註明所需的系統狀態,如果最終達到這種狀態。

但是我不確定應該對process_info(P, status)的回報值有多少信任。

相關問題