2013-02-25 52 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)的回报值有多少信任。

相关问题