Multithreading 如何在Promela中加入流程?

Multithreading 如何在Promela中加入流程?,multithreading,spin,promela,Multithreading,Spin,Promela,我正在用Promela制作一个模型,我需要等待两个过程结束才能继续。我怎样才能用Promela做到这一点呢?首先:理论回顾。 在Promela中,进程在到达其代码末尾时结束,即 activeprocType示例() { /*一些代码*/ /*到此为止*/ } 当进程结束时,它准备好被系统终止。终止是指下列事项: 流程使用的\u pid被释放,现在可以被稍后实例化的任何其他新流程重新使用 进程使用的任何资源都将被释放 但是,请注意,在流程终止方面存在一些约束条件: 进程p_i只有在其处于结

我正在用Promela制作一个模型,我需要等待两个过程结束才能继续。我怎样才能用Promela做到这一点呢?

首先:理论回顾。

在Promela中,进程在到达其代码末尾时结束,即

activeprocType示例()
{
/*一些代码*/
/*到此为止*/
}
当进程结束时,它准备好被系统终止。终止是指下列事项:

  • 流程使用的
    \u pid
    被释放,现在可以被稍后实例化的任何其他新流程重新使用
  • 进程使用的任何资源都将被释放
但是,请注意,在流程终止方面存在一些约束条件:

  • 进程
    p_i
    只有在其处于结束状态且不存在其
    p_j
    pid值大于
    p_i
    且仍处于活动状态的其他进程时才会终止
换句话说,进程只能按与创建相反的顺序终止,如中所示

此限制非常重要,因为在
Spin
中,在任何给定时刻最多只能有255个进程同时处于活动状态。使用
run
生成大量进程的任何尝试都将被阻止,除非同时已正确终止一些现有进程,以便为新进程腾出空间


第二:加入。

现在,要实现
join
操作,我们首先必须确定这样做意味着什么:

  • join
    应该在另一个进程在其执行过程中达到某个
    结束状态时捕获
  • join
    应该在另一个进程有效终止并且系统释放其资源时捕获

  • Impl:案例1)

    第一种情况很容易设计和实现。我们只需要进程之间的一些同步机制,以便通知已达到给定的
    结束状态

    这可以通过几种方式实现,具体取决于您想要塑造的行为风格。下面是一个可能的实现:

    mtype={END};
    proctype do_something(chan out)
    {
    printf(“进程[%d]:正在做某事…\n”,\u-pid);
    完:
    出去!_pid,结束;
    }
    初始化{
    chan in=[5]of{mtype};
    pid-pids[5];
    字节idx;
    /*原子{}在这里是可选的*/
    原子的{
    用于(idx:0..4){
    pids[idx]=运行dou_某事(in);
    }
    printf(“init:初始化所有进程…\n”);
    }
    /*连接段*/
    用于(idx:0..4){
    在??eval(pids[idx])中,结束;
    printf(“初始化:已加入进程%d…\n”,pids[idx]);
    }
    }
    

    Impl:案例2)

    第二种情况的建模有点复杂,据我所知,它可能有一些局限性,在某些设计下并不完全可行

    此方法依赖于变量的值,该变量是一个预定义的全局只读变量,记录当前正在运行的进程数

    我们可以:

    A.以与创建相反的顺序逐个加入我们产生的所有进程

    proctype do\u something()
    {
    printf(“进程[%d]:正在做某事…\n”,\u-pid);
    完:
    /*无事可做*/
    }
    初始化{
    pid-pids[5];
    字节idx;
    /*原子{}在这里是可选的*/
    原子的{
    用于(idx:0..4){
    pids[idx]=运行do_something();
    }
    printf(“init:初始化所有进程…\n”);
    }
    /*连接段*/
    用于(idx:0..4){
    (_nr_pr)