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