网站品牌建设方案,邯郸网站设计费用,英雄联盟网页制作素材,会议网站建设方案模板SystemVerilog线程之fork...join专题 Q#xff1a;fork-join_none开辟的线程在外部任务退出后也会结束吗#xff1f; A#xff1a;后台线程不会结束#xff0c;任何由fork开辟的线程#xff08;join、join_any、join_none#xff09;#xff0c;无论其外部任务#xff…SystemVerilog线程之fork...join专题 Qfork-join_none开辟的线程在外部任务退出后也会结束吗 A后台线程不会结束任何由fork开辟的线程join、join_any、join_none无论其外部任务task何时结束也无论fork何时跳转执行后面的程序都不会将其开辟的线程自动结束。 A对于这些后台线程需要考虑他们接下来是否会影响你的环境比如修改信号、变量或由于反复开辟线程而形成“僵尸线程”。 A比较安全的做法是在fork满足要求之后通过变量、旗语或者更直接的disable fork去终止这些线程。 A对于有握手、仲裁需求的线程比如sequence发送激励不应该粗鲁的使用disable fork结束这些线程而应该在县城内部在其完成握手、仲裁之后的安全阶段结束线程否则容易引起死锁dead-lock。 Q2 父线程和子线程之间的执行关系是什么 A父线程用fork-join_none开辟子线程后父线程如果提前结束二开辟的子线程此时还未结束那么它还将继续执行。如果父线程还未结束时通过disable fork语句来终止父线程那么子线程也将一并被终止。 A父线程即便退出后台的子线程也将继续执行所以在必要时及时终止子线程避免出现“僵尸线程”。 Q3disable fork和disable statement有什么差别 Adisable statement不仅可以终止fork触发的线程还可以终止具名named的进程块process和方法task。disable可以在该进程或者方法内部来停止该进程或者方法也可以在其他进程或方法停止外部的进程或者方法。 A这种停止的方法比disable fork更为自由。disable fork停止的是其所在进程或者方法中的fork触发的所有子线程但他无法停止在他的范围以外的子线程。 Adisable statement在停止目标时查找的是静态线索即所有具备该名称的进程或方法disable fork在停止目标时的范围是其所在线程及其以下的所有子线程。 A Q4嵌套的fork有没有可能被disable fork误杀呢 A不会有这种情况如果能够明确disable fork的边界那么不会误伤到其他相同实例的fork线程。但是如果是按照线程名字使用disable statement则并行的多个实例之间就可能会有误伤的情况那么disable fork就有存在的必要性了。 A使用disable fork时清楚识别所在线程的边界是正确使用他的关键。 Q5使用for配合fork-join_none触发多个线程时需要注意什么 Afor循环配合fork-join_none可以循环触发多个线程但如果这些线程之间有数据公用的情况那么实现的场景可能不是我们期望的。为了避免在并行线程之间出现数据公用的情况就要考虑将调用方法function、task及传入的参数都声明为automatic属性。 A给方法添加automatic描述仅在module、interface、package中需要这么做对于class的方法则是不需要额外添加的。 A对于避免变量公用的情况for循环无论在module、interface、package还是class中都是需要在其内部使用automatic变量来暂存外部变量在将该automatic变量作为参数传入fork-join_none触发线程。