流程未终止导致过多的流程"错误

时间:2018-04-04 10:51:51

标签: spin promela

这是我第一次使用旋转,我遇到了一个我不理解的错误。我知道进程以它们创建的顺序终止,因此我不明白为什么我在循环中调用的函数的进程不会终止。 这是我的代码的一个非常简化的版本:

int limit;

proctype f() {
    limit--;
    printm(limit)
    run g();
}

proctype g() {
    limit++;
}

init {
    limit = 5;
    do
        :: (limit > 0) -> run f();
    od
}

创建限制变量,因此同时运行的进程f不超过5个。流程g会终止,但f不会。所以我收到错误:too many processes 我想知道为什么f没有终止,如果还有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

您的问题基于一个错误的前提:系统中的进程绝不会超过5个,这是不对的。

实际上,可以有任意数量的f()类型的进程,因为绝对不能保证指令:

limit--;
使用

创建进程后立即执行

run f();

进程调度程序可能允许init()在抢占它之前执行几个(数十,数百,更多......)循环迭代,并为某些f()执行任何操作提供机会。< / p>

如果创建了流程g(),那么这可以明确终止。

如果创建了流程f(),则只有在系统中尚未有255个进程并且流程f()具有最高pid时才会终止此进程1}},这样就不必等待其他进程了。

init()进程永远不会终止。

作为可能的解决方法,您可能需要尝试查看_nr_pr

int limit = 5;

proctype f() {
    printm(limit)
}

init {
    do
        :: (_nr_pr <= (limit + 1)) ->
                run f();
    od
}
相关问题