返回介绍

13.7.1 合并事件

发布于 2020-09-09 22:55:52 字数 603 浏览 1046 评论 0 收藏 0

当一个事件被赋值到另外一个事件的时候,这两个事件被合并。因此,在其中一个变量上执行->会影响等待任意一个事件变量的进程。

例如:

event a, b, c;

a = b;
-> c;
-> a; // 也会触发b
-> b; // 也会触发a

a = c;
b = a;
-> a; // 也会触发b和c
-> b; // 也会触发a和c
-> c; // 也会触发a和b

当事件被合并的时候,赋值仅仅影响后续事件控制或等待操作的执行。如果当另外一个事件被赋值到event1的时候如果一个进程被阻塞以等待event1,那么当前的等待进程永远也不会解除阻塞。例如:

fork
    T1: while(1) @E2;
    T2: while(1) @E1;
    T3: begin
        E2 = E1;
        while(1) -> E2;
    end
join

这个例子为三个并发进程产生分支。每一个进程都从相同的时间开始。因此,在进程T1和T2被阻塞的同时,进程T3将事件E1赋值到E2。这意味着进程T1永远也不会解除阻塞,因为事件E2现在是E1。为了解除T1和T2的阻塞,E1和E1的合并必须发生在分支之前。

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

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

发布评论

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