sv标准研读第十五章-进程间同步与通信

书接上回:

sv标准研读第十四章-clocking block

第15章 进程间的同步和通信

15.1 概览

-semaphores

-mailboxes

-named events

15.2 综述

简单的进程间通信可以通过named events来实现,有event trigger和event control过程,分别需要依赖符号->和@,但是named events只能实现静态对象的同步通信,更复杂的进程间通信需要一些机制来实现,比如旗语机制和mailbox机制。

旗语和mailbox是内建类,已经放在了std package里,因此可以直接使用。

15.3旗语

旗语的使用:只有先拿到旗语的key,进程才能够继续往下执行,当key不够时,其他进程处于等待状态,直到key被归还回来。

旗语的声明:

旗语的创建:

获取旗语的key:

归还旗语的key:

没有阻塞获取旗语的key:

15.3.1 new()

函数原型:

作用:创建指定数量key的旗语对象,默认key数量为0。

15.3.2 put()

函数原型:

作用:归还key,默认归还数量是1。

15.3.3 get()

函数原型:

作用:获取key,默认获取数量是1。

15.3.4 try_get()

函数原型:

作用:无阻塞获取key,默认获取数量是1。

15.4 mailbox

作用:实现进程间的通信

进程1可以把message放入mailbox,然后另一个进程去检索mailbox 里的meaasge,从而完成了进程间的通信。

Mailbox实际上就是由一个有边界或者无边界的queue组成。如果是有边界的mailbox,当mailbox里的queue满了时,想要继续存储meaasge到mailbox的进程就会被挂起,直到指定数量的空间被释放出来。无界queue组成的mailbox就不会出现进程被挂起的现象。

Mailbox声明:

Mailbox创建:

将message放入mailbox:

无阻塞将message放入mailbox:

获取mailbox里的message:

无阻塞获取mailbox里的message:

获取mailbox里message的数量:

15.4.1 new()

Bound参数为0时,表示创建一个无界queue的mailbox;否则,bound的值就是queue的size。

15.4.2 num()

获取mailbox里message的数量。

15.4.3 put()

往mailbox里放message。如果mailbox是满的,进程会被挂起直到空间被释放出来。存入顺序是FIFO的顺序。

15.4.4 try_put()

无阻塞的往mailbox里放message,因此这个函数只有对有界mailbox才有意义。如果mailbox没满,函数会返回一个正整数,如果满了,会返回0。存入顺序是FIFO的顺序。

15.4.5 get()

获取message。如果mailbox是空的,进程会被挂起直到有message;如果message类型和mailbox里message类型不一致,会报一个run-time error。

15.4.6 try_get()

无阻塞获取message。如果mailbox是空的,返回0,如果类型不匹配,返回一个负整数,如果mailbox不空且数据类型匹配,返回一个正整数。

15.4.7 peek()

Peek和get的区别是,前者是复制,后者是移出。如果mailbox是空的,进程会被挂起直到有message;如果message类型和mailbox里message类型不一致,会报一个run-time error。

15.4.8 try_peek()

无阻塞复制message。如果mailbox是空的,返回0,如果类型不匹配,返回一个负整数,如果mailbox不空且数据类型匹配,返回一个正整数。

15.4.9 参数化的mailbox

默认情况下,mailbox是无参数的,因此mailbox可以用来传递任何类型的message,一旦写入的message和获取message的类型不匹配,会在run-time阶段报error。

但是也可以创建一个参数化的mailbox,那么这个mailbox就只能传递指定参数类型的message,并且在编译阶段就会检查相关写入和获取message函数的参数类型,如果类型不匹配,就会报编译错误。

举例:

参数化mailbox和普通mailbox一样都有前面几节介绍的函数。

15.5 named events

当声明数据类型是event时,就表明这是一个named event。

Named event有触发和等待的动作,触发可以用符号->/->>实现;等待可以用符号@/wait()实现。

15.5.1 触发一个事件

语法:

触发的作用是使等待该事件的阻塞进程被解除。

->>是针对非阻塞事件的,作用是触发一个非阻塞事件的执行,可以加上delay控制。

15.5.2 等待一个事件

使用@符号等待一个事件被触发。

注意->语句要在@语句之后执行。否则@语句会一直被阻塞。

15.5.3内置的触发方法

方法原型:

如果在当前time step,事件被触发过了,那么调用该函数会返回1,否则返回0。如果事件为null,返回0。

这个方法一般是搭配wait()方法使用的,如下:

和前面的->/@组合不同的是,wait()/trigged()方法无需强制规定wait()语句必须出现在triggered()语句之前,它也可以和trigger()语句在同一个timestep执行,当wait()和triggered()同时发生时,wait()阻塞进程始终会被解除。

举例:

上面第一个fork里,@语句在trigger()语句之前执行,这是保证@语句阻塞的前提条件,所以能够跳出fork;第二个fork,->和wait是同时刻执行,也能跳出fork。

15.5.4 事件排序:wait_order()

wait_order构造挂起调用进程,直到所有指定的事件都按照给定的顺序(从左到右)被触发,或者任何未被触发的事件被乱序触发,从而导致操作失败。

为了使wait_order成功,在序列中的任何一点,后续事件都应按规定的顺序触发,这些事件在此时都不应被触发,否则序列将已经失败。前面的事件并不局限于只发生一次。换句话说,一旦事件按照规定的顺序发生,就可以再次触发它,而不会导致构造失败。

只有列表中的第一个事件可以等待持久triggered事件。

当失败时所采取的操作取决于是否指定了可选的action_block else语句(失败语句)。如果指定了它,则在失败时执行该else语句。如果未指定fail语句,则失败将生成run-time错误。

举例1:

挂起当前进程,直到事件a、b和c按照a - > b - > c的顺序触发。如果事件触发的顺序乱了,则会产生run-time错误。

举例2:

在本例中,fail语句指定在失败时显示一条用户消息,但不生成错误。

15.5.5 named event可使用的操作符

事件可以使用赋值操作符,相当于将事件句柄传递给另一个事件,二者共享queue。

15.5.5.1 merging event

当使用赋值操作符时,相当于将两个事件进行了合并。使用->触发了任意一个事件都会导致两个阻塞进程被解除。举例:

15.5.5.2 回收event

当event被赋值为null时,任何对该事件的trigger都不起作用。举例:

15.5.5.3事件比较

只允许下面几种比较:

-和null或者其他事件使用==比较

-和null或者其他事件使用!=比较

-和null或者其他事件使用===比较

-和null或者其他事件使用!==比较

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch基本使用及介绍

Elasticsearch 1. 关于各种数据库的使用 关于MySQL:是关系型数据库,能清楚的表示数据之间的关系,并且,是基于磁盘存储的,可以使用相对较低的成本存储大量的数据 关于Redis:是基于K-V结构的在内存中读写数…

2011年国赛高教杯数学建模B题交巡警服务平台的设置与调度解题全过程文档及程序

2011年国赛高教杯数学建模 B题 交巡警服务平台的设置与调度 有困难找警察”,是家喻户晓的一句流行语。警察肩负着刑事执法、治安管理、交通管理、服务群众四大职能。为了更有效地贯彻实施这些职能,需要在市区的一些交通要道和重要部位设置交巡警服务平台…

【jQuery】jQuery 处理 Ajax 以及解决跨域问题的方式

文章目录 HTTP原生创建 AjaxjQuery 处理 Ajax$.ajax()$().load()$.get()$.post() 跨域CORSJSONPiframeweb sockets HTTP 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计 HTTP 最初的目的是为了提供一种发…

QT中中文显示乱码问题

在VS2013中用QT开发GUI应用程序&#xff0c;Qt中显示中文乱码 一&#xff1a; //解决QT中中文显示乱码问题 #pragma execution_character_set("utf-8") 二&#xff1a;在main函数中添加以下代码&#xff1a; #include <QTextCodec>void main() {QTextCod…

javaweb-mybatis之动态sql

(1).if标签 编写好方法之后&#xff0c;选中方法名&#xff0c;alt回车&#xff0c;选第一个generate statement快捷生成xml里的标签 (2).foreach标签 用于批量删除 (3)sql和include标签

别再犯这些Java并发编程的常见错误!你中了几个?

你好&#xff0c;我是忆~遂愿&#xff0c;全网2w粉丝&#xff0c;《遂愿盈创》社群主理人。 副业启航① | 遂愿盈创&#xff08;对副业感兴趣免费可入&#xff0c;多种赚钱实战项目等你来&#xff0c;一起探寻副业快速变现的途径&#xff1b;以及对接互联网大厂商务合作&#x…

YOLO11改进 | 主干网络 | 将backbone替换为Swin-Transformer结构【论文必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的backb…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…

AI金融攻防赛:YOLO理论学习及赛题进阶思路(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何在金融场景凭证篡改检测中应用YOLO算法。我们将从模型概述、数据准备、训练流程以及模…

基于springboot的在线考试与学习交流网页

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

1024程序员节 | 一个机械专业的牛马转行牛码的经历

1024程序员节 | 一个机械专业的牛马转行牛码的经历 从本科到研究生 在二进制构筑的计算机世界里&#xff0c;1024是技术人最熟悉的“整数”。又到了一年一度的程序员节&#xff0c;时间过得很快&#xff0c;2022年毕业&#xff0c;转眼间毕业了2年了。本硕机械专业的毕业的职…

基于SpringBoot的旅游网站的设计与实现

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

SqlDbx客户端连接服务器Oracle数据库

查了很多文章&#xff0c;介绍的不对&#xff0c;走了好多弯路&#xff0c;最后整理一下&#xff0c;供参考 一、下载Oracle客户端 1、SqlDbx如果是32位的&#xff0c;客户端也要下载32位的 2、Oracle客户端版本要和服务端版本一致&#xff08;本例用的是12.1.0.2.0&#xff…

kebuadm部署k8s集群

官方文档&#xff1a; Installing kubeadm | Kubernetes 切记要关闭防⽕墙、selinux、禁用交换空间&#xff0c; cpu核⼼数⾄少为2 内存4G kubeadm部署k8s⾼可用集群的官方文档&#xff1a; Creating Highly Available Clusters with kubeadm | Kubernetes 你需要在每台…

Elasticsearch是做什么的?

初识elasticsearch 官方网站&#xff1a;Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic Elasticsearch是做什么的&#xff1f; Elasticsearch 是一个分布式搜索和分析引擎&#xff0c;专门用于处理大规模数据的实时搜索、分析和存储。它基于 Apache Lucene …

python语言入门必须要学习的模块化编程案例游戏---画图案例(三)【源码大全】

彩虹五角星 import turtle #引用turtle库 q turtle.Pen() #构造画笔 turtle.bgcolor("black") …

windows mysql 8.0版本重置root密码

1.停止mysql服务 以管理员运行cmd 2.安全模式启动 mysqld --console --skip-grant-tables --shared-memory 3.修改密码 再开个cmd窗口就可以进入了&#xff1a;mysql 先进入mysql database&#xff1a;use mysql 修改密码&#xff1a;ALTER USER rootlocalhost IDENTIFIED …

数据链路层数据帧格式及网络层IP数据包格式

数据帧格式 前导码&#xff1a;进入物理层之前的缓冲区&#xff0c;包含的是7个字节&#xff08;56比特&#xff09;交替出现的0和1&#xff0c;作用&#xff1a;提醒接受系统有帧到来&#xff0c;并且使它与输入定时同步 帧起始定界符&#xff1a;1字节&#xff08;8比特&…

《深度学习》【项目】自然语言处理——情感分析 <下>

目录 一、了解项目 1、任务 2、文件内容 二、续接上篇内容 1、打包数据&#xff0c;转化Tensor类型 2、定义模型&#xff0c;前向传播函数 3、定义训练、测试函数 4、最终文件格式 5、定义主函数 运行结果&#xff1a; 一、了解项目 1、任务 对微博评论信息的情感分…

基础IO -- 理解文件(2)

目录 三&#xff1a;理解文件 1.先用和认识系统调用的文件操作 a. 标记位传参的理解 b.文件打开后权限 c. 关闭文件 d. 向文件里写入 2.引入文件操作符fd 3.理解fd 4.Linux下一切皆文件 5.解决前面衍生出的一些问题 C语言FILE*的理解 C语言为什么这么做 三&#xff…