课程链接:https://www.bilibili.com/video/BV1k7411H7Jo?p=24
利用event语句可以实现各个事件之间相互配合:
首先声明两个新事件,接着把事件done赋值给done_too,这样done和done_too指向同一个事件,如果其中一个事件被触发,相当于同时触发了这两个事件。然后定义了一个trigger任务,作用是对事件event进行触发。接着看下面的第一个fork…join语句,语句里的@done_too表明这个线程会持续检测done_too信号是否被触发,直到触发之前都会占用仿真资源。而利用trigger任务去触发done也就相当于触发了done_too,从而让@done_too这个阻塞语句结束,避免了仿真资源的浪费。第二个fork…join语也是同理,wait语句表明在会对blast的触发状态进行检测,直到触发以前都会对仿真资源进行占用。线程先触发了blast事件,因此结束了wait语句,也避免了仿真资源的浪费。
由于使用的是wait_order,则只有abc三个任务都按顺序发生以后阻塞任务才会退出。如果没有按顺序发生,会使等待操作失败。可以像图片中一样使用else语句进行提示。
旗语(semaphore):由于多个线程同时进行,那么它们可能会对同一个资源进行访问、读取或者修改。为了保护资源不被破坏,需要对共享的资源进行访问控制。常见的方法是互斥访问保护。假如线程A和线程B都需要访问资源,那么旗语的作用就是保证在线程A访问资源的时候线程B无法访问,只有在A退出以后B才可以。
后面基本都是在讲这些语法了,为什么不搞一段程序分析一下各个进程都是怎么获得钥匙又是怎么返还钥匙的呢,一直在讲语法真的不太懂,还是去看绿皮书把。