windows C++ 并行编程-使用消息块筛选器
本文档演示了如何使用筛选器函数,使异步消息块能够根据消息的有效负载接受或拒绝消息。
创建消息块对象(例如 concurrency::unbounded_buffer、concurrency::call 或 concurrency::transformer)时,可以提供筛选器函数,用于确定消息块是接受还是拒绝消息。 筛选器函数是保证消息块仅接收特定值的有效方式。
筛选器函数很重要,因为它们使你能够连接消息块以形成数据流网络。 在数据流网络中,消息块通过仅处理满足特定标准的消息来控制数据流。 将数据流网络与控制流模型进行比较,在后者中,数据流是通过使用条件语句、循环等控制结构来调节的。
本文档提供了有关如何使用消息筛选器的基本示例。
示例:count_primes 函数
考虑以下函数 count_primes,该函数说明了不筛选传入消息的消息块的基本用法。 此消息块将质数追加到 std::vector 对象。 count_primes 函数将几个数字发送到消息块,从消息块接收输出值,并将这些数字打印到控制台。
// Illustrates usage of a message buffer that does not use filtering.
void count_primes(unsigned long random_seed)
{// Holds prime numbers.vector<unsigned long> primes;// Adds numbers that are prime to the vector object.transformer<unsigned long, unsigned long> t([&primes](unsigned long n) -> unsigned long{if (is_prime(n)){primes.push_back(n);}return n;});// Send random values to the message buffer.mt19937 generator(random_seed);for (int i = 0; i < 20; ++i){send(t, static_cast<unsigned long>(generator()%10000));}// Receive from the message buffer the same number of times// to ensure that the message buffer has processed each message.for (int i = 0; i < 20; ++i){receive(t);}// Print the prime numbers to the console.wcout << L"The following numbers are prime: " << endl;for(unsigned long prime : primes){wcout << prime << endl;}
}
transformer 对象处理所有输入值;但是,它只需要那些为质数的值。 尽管可以编写应用程序以使消息发送方仅发送质数,但并不能始终得知消息接收方的要求。
示例:count_primes_filter 函数
以下函数 count_primes_filter 执行与 count_primes 函数相同的任务。 但是,此版本中的 transformer 对象使用筛选器函数以便仅接受那些为质数的值。 执行该操作的函数仅接收质数;因此,它不必调用 is_prime 函数。
由于 transformer 对象仅接收质数,所以 transformer 对象本身可以保存质数。 换言之,此示例中的 transformer 对象不需要将质数添加到 vector 对象。
// Illustrates usage of a message buffer that uses filtering.
void count_primes_filter(unsigned long random_seed)
{// Accepts numbers that are prime.transformer<unsigned long, unsigned long> t([](unsigned long n) -> unsigned long{// The filter function guarantees that the input value is prime.// Return the input value.return n;},nullptr,[](unsigned long n) -> bool{// Filter only values that are prime.return is_prime(n);});// Send random values to the message buffer.mt19937 generator(random_seed);size_t prime_count = 0;for (int i = 0; i < 20; ++i){if (send(t, static_cast<unsigned long>(generator()%10000))){++prime_count;}}// Print the prime numbers to the console. wcout << L"The following numbers are prime: " << endl;while (prime_count-- > 0){wcout << receive(t) << endl;}
}
transformer 对象现在仅处理那些为质数的值。 在前面的示例中,transformer 对象处理所有消息。 因此,前面的示例必须接收与其发送的相同数量的消息。 此示例使用 concurrency::send 函数的结果来确定要从 transformer 对象接收的消息数。 send 函数在消息缓冲区接受消息时返回 true,在消息缓冲区拒绝消息时返回 false。 因此,消息缓冲区接受消息的次数与质数的计数相匹配。
示例:已完成的消息块筛选器代码示例
以下代码显示完整示例。 该示例同时调用 count_primes 函数和 count_primes_filter 函数。
// primes-filter.cpp
// compile with: /EHsc
#include <agents.h>
#include <algorithm>
#include <iostream>
#include <random>using namespace concurrency;
using namespace std;// Determines whether the input value is prime.
bool is_prime(unsigned long n)
{if (n < 2)return false;for (unsigned long i = 2; i < n; ++i){if ((n % i) == 0)return false;}return true;
}// Illustrates usage of a message buffer that does not use filtering.
void count_primes(unsigned long random_seed)
{// Holds prime numbers.vector<unsigned long> primes;// Adds numbers that are prime to the vector object.transformer<unsigned long, unsigned long> t([&primes](unsigned long n) -> unsigned long{if (is_prime(n)){primes.push_back(n);}return n;});// Send random values to the message buffer.mt19937 generator(random_seed);for (int i = 0; i < 20; ++i){send(t, static_cast<unsigned long>(generator()%10000));}// Receive from the message buffer the same number of times// to ensure that the message buffer has processed each message.for (int i = 0; i < 20; ++i){receive(t);}// Print the prime numbers to the console.wcout << L"The following numbers are prime: " << endl;for(unsigned long prime : primes){wcout << prime << endl;}
}// Illustrates usage of a message buffer that uses filtering.
void count_primes_filter(unsigned long random_seed)
{// Accepts numbers that are prime.transformer<unsigned long, unsigned long> t([](unsigned long n) -> unsigned long{// The filter function guarantees that the input value is prime.// Return the input value.return n;},nullptr,[](unsigned long n) -> bool{// Filter only values that are prime.return is_prime(n);});// Send random values to the message buffer.mt19937 generator(random_seed);size_t prime_count = 0;for (int i = 0; i < 20; ++i){if (send(t, static_cast<unsigned long>(generator()%10000))){++prime_count;}}// Print the prime numbers to the console. wcout << L"The following numbers are prime: " << endl;while (prime_count-- > 0){wcout << receive(t) << endl;}
}int wmain()
{const unsigned long random_seed = 99714;wcout << L"Without filtering:" << endl;count_primes(random_seed);wcout << L"With filtering:" << endl;count_primes_filter(random_seed);/* Output:99739349924188931297712786473229With filtering:The following numbers are prime:99739349924188931297712786473229*/
}
可靠编程
筛选器函数可以是 lambda 函数、函数指针或函数对象。 每个筛选器函数采用以下格式之一:
bool (T)
bool (T const &)
为了消除不必要的数据复制,需要按值传输聚合类型时,请使用第二种格式。
相关文章:
windows C++ 并行编程-使用消息块筛选器
本文档演示了如何使用筛选器函数,使异步消息块能够根据消息的有效负载接受或拒绝消息。 创建消息块对象(例如 concurrency::unbounded_buffer、concurrency::call 或 concurrency::transformer)时,可以提供筛选器函数,用于确定消息块是接受还…...

【mysql技术内幕】
MySQL之技术内幕 1.MVCC模式2. 实现mvcc模式的基础点3.MySQL锁的类型4. 说下MySQL的索引有哪些吧?5. 谈谈分库分表6. 分表后的id咋么保证唯一性呢?7. 分表后非sharding key的查询咋么处理的? 1.MVCC模式 MVCC, 是multi-version concurrency c…...
快递物流单号识别API接口DEMO下载
单号识别API为用户提供单号识别快递公司服务,依托于快递鸟大数据平台,用户提供快递单号,即可实时返回可能的一个或多个快递公司,存在多个快递公司结果的,大数据平台根据可能性、单号量,进行智能排序。 应用…...
Jetpack——Room
概述 Room是谷歌公司推出的数据库处理框架,该框架同样基于SQLite,但它通过注解技术极大简化了数据库操作,减少了原来相当一部分编码工作量。在使用Room之前,要先修改模块的build.gradle文件,往dependencies节点添加下…...

Dynamic Connected Networks for Chinese Spelling Check(ACL2021)
Dynamic Connected Networks for Chinese Spelling Check(ACL2021) 一.概述 文中认为基于bert的非自回归语言模型依赖于输出独立性假设。不适当的独立性假设阻碍了基于bert的模型学习目标token之间的依赖关系,从而导致了不连贯的问题。为些,…...

前端vue-3种生命周期,只能在各自的领域使用
上面的表格可以简化为下面的两句话: setup是语法糖,下面的两个import导入是vue3和vue2的区别,现在的vue3直接导入,比之前vue2简单 还可以是导入两个生命周期函数...
el-upload如何自定展示上传的文件
Element UI 中,el-upload 组件支持通过插槽(slot)来自定义文件列表的展示方式。这通常是通过 file-list 插槽来实现的。下面是一个使用 el-upload 组件并通过 file-list 插槽来自定义文件列表展示的完整示例代码。 在这个示例中,…...
研1日记15
1. 文心一言生成: 在PyTorch中,nn.AdaptiveAvgPool1d(1)是一个一维自适应平均池化层。这个层的作用是将输入的特征图(或称为张量)在一维上进行自适应平均池化,使得输出特征图的大小在指定的维度上变为1。这意味着&…...

基于Nginx搭建点播直播服务器
实现直播和点播离不开服务器⽀持,可以使用开源的NGINX服务器搭建直播和点播服务。 当然,NGINX本身是不⽀持视频的,需要为NGINX增加相应的RTMP模块进行支持。 1、下载nginx和rtmp模块 # nginx wget ht tp://nginx.org/download/nginx-1.18.…...
QT LineEdit显示模式
QT LineEdit显示模式 QLineEdit 显示模式: Normal 普通模式 NoEcho 不回写,即输入内容是有的,但是显示不出来,就是不在 QLineEdit 输入框中显示,但是触发例如 textChanged 信号会将所输入的文字写出来 Password 显示密码 Pa…...
IT技术在数字化转型中的关键作用
IT技术在数字化转型中的关键作用 在当今数字化浪潮中,IT技术无疑扮演着核心角色。无论是企业的数字化转型,还是政府公共服务的智能化提升,信息技术都在推动着整个社会向更高效、更智能的方向发展。本文将探讨IT技术在数字化转型中的关键作用…...

【C++指南】C++中nullptr的深入解析
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 一、nullptr的引入背景 二、nullptr的特点 1.类型安全 2.明确的空指针表示 3.函数重载支…...

解决启动docker desktop报The network name cannot be found的问题
现象 deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \wsl$\docker-desktop\etc\wsl_bootstrap_version: The network name…...
Guava: 探索 Google 的 Java 核心库
Guava 是 Google 开发的一套 Java 核心库,它提供了一系列新的集合类型(例如多映射 multimap 和多集合 multiset)、不可变集合、图形库以及用于并发、I/O、哈希、原始类型、字符串等的实用工具。Guava 在 Google 的大多数 Java 项目中得到了广…...
Qt-qmake概述
概述 qmake工具为您提供了一个面向项目的系统,用于管理应用程序、库和其他组件的构建过程。这种方法使您能够控制使用的源文件,并允许简洁地描述过程中的每个步骤,通常在单个文件中。qmake将每个项目文件中的信息扩展为一个Makefile…...

【protobuf】ProtoBuf的学习与使用⸺C++
W...Y的主页 😊 代码仓库分享💕 前言:之前我们学习了Linux与windows的protobuf安装,知道protobuf是做序列化操作的应用,今天我们来学习一下protobuf。 目录 ⼀、初识ProtoBuf 步骤1:创建.proto文件 步…...

【iOS】MVC架构模式
文章目录 前言MVC架构模式基本概念通信方式简单应用 总结 前言 “MVC”,即Model(模型),View(视图),Controller(控制器),MVC模式是架构模式的一种。 关于“架构模式”&a…...

ML 系列:机器学习和深度学习的深层次总结(08)—欠拟合、过拟合,正确拟合
ML 系列赛:第 9 天 — Under、Over 和 Good Fit 文章目录 一、说明二、了解欠拟合、过拟合和实现正确的平衡三、关于泛化四、欠拟合五、过拟合六、适度拟合七、结论 一、说明 在有监督学习过程中,对于指定数据集进行训练,训练结果存在欠拟合…...
Unity-物理系统-刚体加力
一 刚体自带添加力的方法 给刚体加力的目标就是 让其有一个速度 朝向某一个方向移动 1.首先应该获取刚体组件 rigidBody this.GetComponent<Rigidbody>(); 2.添加力 //相对世界坐标 //世界坐标系 Z轴正方向加了一个里 //加力过后 对象是否停止…...

深入探究PR:那些被忽视却超实用的视频剪辑工具
如果想要了解视频剪辑的工具,那一定听说过pr视频剪辑吧。如果你是新手其实我更推荐你从简单的视频剪辑工具入手,这次我就介绍一些简单好操作的视频剪辑工具来入门吧。 1.福晰视频剪辑 连接直达>>https://www.pdf365.cn/foxit-clip/ 这款工具操…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...