返回介绍

9.9 精细的进程控制

发布于 2020-09-09 22:55:48 字数 1889 浏览 1100 评论 0 收藏 0

进程是一个内建的类,一旦一个进程被启动,就允许这个进程访问和控制另外一个进程。用户可以声明进程类型的变量,并且能够通过任务对它们进行安全的传递,或者将它们结合到其它对象中。进程类的原型如下:

class process;
    enum state {FINISHED, RUNNING, WAITING, SUSPENDED, KILLED};

    static function process self();
    function state status();
    task kill();
    task await();
    task suspend();
    task resume();
endclass

进程类型的对象在进程产生的时候在内部产生。用户不能够产生进程类型的对象;调用new不会产生一个新的进程,相反,它还会导致一个错误。进程类不能被扩展。对进程类的扩展会导致一个编译错误。进程类型的对象是唯一的;一旦底层进程中止并且对象的所有引用都被丢弃,那么它们就变成有效的以便复用。

self()函数返回当前进程的句柄,也就是说,一个指向进行调用的进程的句柄。

status() 函数返回进程的状态,这些状态由枚举state定义:

  • FINISHED 进程正常中止。
  • RUNNING 进程当前正在运行(未处于阻塞状态)。
  • WAITING 进程正在一个阻塞语句中等待。
  • SUSPENDED 进程停止了,正在等待重新开始。
  • KILLED 进程被强制销毁(通过kill或disable)。

kill()任务中止指定的进程以及它的所有子进程,也就是说,进程通过fork语句产生的进程会被销毁。如果进程在没有等待某种其它条件(例如一个事件、wait表达式、或延时)的时候被中止,那么进程应该在当前时间步值的某个未指定的时间点被中止。

await()任务允许一个进程等待另外一个进程的结束。在当前的进程中调用这个任务是错误的,也就是说,进程不能等待它自己的结束。

suspend()任务允许一个进程挂起它自己或另外一个进程的执行。如果进程在没有等待某种其它条件(例如一个事件、wait表达式、或延时)的时候被挂起,那么进程应该在当前时间步值的某个未指定的时间点被挂起。多次调用这个方法或者对同一个进程调用这个方法不起任何效果。

resume()任务重新启动先前被挂起的进程。对一个被挂起而又被另外一个条件阻塞的进程会使进程重新敏感于事件表达式,或者等待那个等待条件为“真”,或者等待延时过期。如果等待条件现在为“真”,或者原来的延时已经过期,那么进程被调度到Active或Reactive区域,使得它在当前的时间步值继续执行。对一个挂起它本身的进程调用resume会引起在调用suspend之后的语句上继续执行。

由于将N指定为任务参数,因此下面的例子可以启动任意数目的进程。接下来,任务会等待最后一个进程被启动,然后会等待第一个进程中止。这时,父进程会强行中止所有还没有结束的分支进程。

task do_n_way(int N);
    process job[1:N];

    for (int j=1; j<=N; j++)
        fork
            automatic int k = j;
            begin
                job[j] = process::self();
                ... ;
            end
        join_none

    for (int j=1; j<=N; j++)  // 等待启动所有进程
        wait(job[j] != null);

    job[1].await();  // 等待第一个进程结束

    for (int k=1; k<=N; k++) begin
        if (job[k].status != process::FINISHED)
            job[k].kill();
    end
endtask

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文