当前位置: 首页 > news >正文

【C++11】深度解析--异步操作(什么是异步?异步有那些操作?异步操作有什么用呢?)

目录

一、前言

二、什么是异步操作呢?

🔥异步的概念🔥

🔥异步的生活案例说明🔥

三、异步有那些操作呢? 

🔥std::future🔥

💢std::future 的概念💢

💢主要成员函数💢

💧std::future 与 std::async 💧

💧std::future 与 std::packaged_task💧 

💧std::future与std::promise💧  

四、总结 

五、共勉


一、前言

        如何让程序更高效、更快速一直是开发者追求的目标C++11】 引入的异步操作,为我们提供了一个解决这个问题的新方式。通过使用 std::async std::future 等工具,我们可以轻松地处理并发任务,让程序在处理复杂操作时不再卡顿。
        本篇文章将带你轻松入门 【C++11】 的异步操作,从基础概念到实际应用,逐步讲解如何利用这些新工具编写更高效的程序。

 二、什么是异步操作呢?

🔥异步的概念🔥

异步操作同步操作 相对在同步操作中,程序必须按顺序执行各个任务,等待前一个任务完成后才能继续执行下一个任务。在异步操作中,程序可以启动一个耗时任务,然后继续执行其他任务,而无需等待该耗时任务完成。当耗时任务完成后,程序会得到通知并处理结果。 

🔥异步的生活案例说明🔥

点餐和上菜

想象你在餐厅点餐的过程,这是一个很好理解异步概念的例子。

 同步操作的情况:

  • 你走进餐厅,点了一份牛排。
  • 你站在柜台前等着,直到牛排做好并送到你手上,你才能去找座位开始吃饭。

在这个例子中:
顾客(主线程)发起一个任务(子线程做牛排),做牛排的过程中顾客没去做别的事情而是死等,这就是一条时间线(同步),此时效率相对较低

异步操作的情况: 

  • 你走进餐厅,点了一份牛排。
  • 你点完餐后,服务员给你一个号牌,你可以去找座位坐下。
  • 在等待牛排做好期间,你可以先喝点水,聊聊天,或者刷刷手机。
  • 当牛排做好后,服务员会叫号或者送到你桌前,你再开始吃饭。

在这个例子中:
顾客(主线程)发起一个任务(子线程做牛排),做牛排的过程中顾客去做的别的事情,有两条时间线(异步),此时效率相对较高


三、异步有那些操作呢? 

        由于 多线程程序中的任务大都是异步 的,主线程 和 子线程 分别执行不同的任务,如果想要在主线中得到某个子线程任务函数返回的结果可以使用【C++11】提供的 std::future类,这个类需要和其他类或函数搭配使用

🔥std::future🔥

💢std::future 的概念💢

std::future 是C++11标准库中的⼀个模板类它表⽰⼀个异步操作的结果(完成线程间的通信)。当我们在多线程编程中使⽤ 异步任务时,std::future 可以帮助我们在需要的时候获取任务的执⾏结果。std::future 的⼀个重要特性 是能够阻塞当前线程,直到异步操作完成,从⽽确保我们在获取结果时不会遇到未完成的操作。
它主要与 std::asyncstd::promisestd::packaged_task 一起使用。

所需的头文件:

#include <future>

💢主要成员函数💢

get() 

get() std::future 最重要的成员函数。它用于获取异步操作的结果。如果结果还不可用,get() 会阻塞调用线程,直到结果可用。 

T get();
  • 如果异步操作成功完成,get() 返回结果。
  • 如果异步操作抛出异常,get() 重新抛出该异常。

valid() 

valid() 用于检查 std::future 是否有一个与之关联的共享状态。如果 std::future 还没有获取过结果或者还没有被移动,它返回 true。 

bool valid() const noexcept;

wait() 

wait() 用于阻塞调用线程,直到异步操作完成。 

void wait() const;

wait_for() 

wait_for() 用于阻塞调用线程,直到异步操作完成或者指定的时间段过去。 

template< class Rep, class Period >
std::future_status wait_for( const std::chrono::duration<Rep, Period>& rel_time ) const;

返回值:

  • std::future_status::ready异步操作已完成。
  • std::future_status::timeout超时时间已到,但异步操作尚未完成。
  • std::future_status::deferred异步操作被延迟(即 std::launch::deferred)。


下面我们将会 结合std::asyncstd::promisestd::packaged_task 举例说明 std::future 的成员函数的各种用法 


💧std::future 与 std::async 💧

std::async 是 【C++11】 引入的一个函数模板,用于启动异步任务。它允许你将某个函数的调用放到一个独立的线程中执行,并返回一个 std::future 对象来获取函数的结果。

语法 

#include <future>template< class Function, class... Args >
std::future<typename std::result_of<Function(Args...)>::type>
async( std::launch policy, Function&& f, Args&&... args );template< class Function, class... Args >
std::future<typename std::result_of<Function(Args...)>::type>
async( Function&& f, Args&&... args );
  • policy启动策略,可以是 std::launch::asyncstd::launch::deferred,或者是它们的组合。
    • std::launch::async在新线程中异步执行任务。
    • std::launch::deferred延迟执行任务,直到调用 futuregetwait 成员函数。
  • f要执行的函数。
  • args传递给函数 f 的参数。

返回值 

返回一个 std::future 对象,用于获取异步任务的结果。 


异步任务的启动策略 

  • std::launch::async:强制在新线程中异步执行任务。
  • std::launch::deferred:延迟执行任务,直到调用 std::futuregetwait 成员函数。
  • 默认行为:如果未指定 policy,则系统将自动选择合适的策略。

举例说明: 模拟一个去餐厅点牛排的过程     进行异步操作 

#include <iostream>
#include <thread>
#include <future>
#include <chrono>// 模拟一个耗时操作的函数
int cook_steak(int timesteak) 
{std::cout << "make steak" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(timesteak)); // 模拟做牛排的时间return 1; // 假设 1 代表牛排已做好
}int main() 
{// 创建一个 packaged_task 对象,封装耗时操作std::packaged_task<int(int)> task(cook_steak);// 获取与 packaged_task 相关联的 future 对象std::future<int> result = task.get_future();// 启动任务,任务将在当前线程执行std::thread task_thread(std::move(task), 5);// 在等待牛排的同时,可以做其他事情   每过一秒检查一次while (result.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {std::cout << "...Doing other things while waiting for the steak...\n";}// 等待任务完成并获取结果int steak_status = result.get();if (steak_status == 1) {std::cout << "Steak is ready! Time to eat.\n";}// 确保任务线程完成task_thread.join();return 0;
}

输出结果:

make steak
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
Steak is ready! Time to eat.

此时我们发现,子线程 和 主线程 同时执行 在子线程运行的时候,主线程可以做其它的事情,而不受子线程的影响。 这就是  ---- 异步操作


如果将 async 模式  改为  deferred 模式 

deferred 模式  它表示任务将被推迟到调用 get()wait() 时才执行。简单来说,deferred 模式不会在任务启动时立即执行任务,而是将任务的执行推迟到需要结果时。 

#include <iostream>
#include <thread>
#include <future>
#include <chrono>// 模拟一个耗时操作的函数
int cook_steak(int timesteak) 
{std::cout << "make steak" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(timesteak)); // 模拟做牛排的时间return 1; // 假设 1 代表牛排已做好
}int main() 
{// 启动异步任务做牛排std::future<int> result = std::async(std::launch::deferred, cook_steak , 5);std::cout << "...Doing other things while waiting for the steak...\n";// 获取异步任务的结果(即牛排是否做好)// std::future<int>::get() 用于获取异步任务的结果,如果没有结果就会阻塞int steak_status = result.get();if (steak_status == 1) {std::cout << "Steak is ready! Time to eat.\n";}return 0;
}

 输出结果:

...Doing other things while waiting for the steak...
make steak
Steak is ready! Time to eat.

我们发现,deferred 模式不会在任务启动时立即执行任务,而是将任务的执行推迟到需要结果时。 


💧std::future 与 std::packaged_task💧 

std::packaged_task 是 C++11 提供的一个工具,用于将任何可调用对象(如函数、函数对象、lambda 表达式等)封装成一个任务,然后可以通过 std::future 来获取任务的结果。它可以用于异步操作和线程操作,将任务与结果进行关联。 

 std::packaged_task 的基本使用

  • 定义任务:封装一个任务,例如一个函数或 lambda 表达式。
  • 创建 std::packaged_task 对象:将任务封装到 std::packaged_task 对象中。
  • 获取 std::future 对象:通过 std::packaged_task::get_future() 方法获取 std::future 对象,用于获取任务的结果。
  • 启动任务:通过 std::thread 或直接调用 operator() 启动任务。
  • 获取结果:通过 std::future::get() 方法获取任务的结果。

举例说明: 模拟一个去餐厅点牛排的过程     进行异步操作  

#include <iostream>
#include <thread>
#include <future>
#include <chrono>// 模拟一个耗时操作的函数
int cook_steak(int timesteak) 
{std::cout << "make steak" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(timesteak)); // 模拟做牛排的时间return 1; // 假设 1 代表牛排已做好
}int main() 
{// 创建一个 packaged_task 对象,封装耗时操作std::packaged_task<int(int)> task(cook_steak);// 获取与 packaged_task 相关联的 future 对象std::future<int> result = task.get_future();// 启动任务,任务将在当前线程执行std::thread task_thread(std::move(task), 5);// 主线程可以继续执行其他操作std::cout << "...Doing other things while waiting for the steak...\n";// 等待任务完成并获取结果int steak_status = result.get();if (steak_status == 1) {std::cout << "Steak is ready! Time to eat.\n";}// 确保任务线程完成task_thread.join();return 0;
}

 输出结果:

make steak
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
Steak is ready! Time to eat.

总结:

  • 异步操作:由于 std::thread 用于在新线程中执行任务,因此代码中确实存在异步操作。主线程和子线程并行执行任务和其他操作。
  • 子线程生成std::thread 的使用确保了新线程的创建,这意味着 cook_steak(5) 会在子线程中执行,而主线程则继续执行其他操作。

关键点:异步操作是通过 std::thread 来实现的,确保了任务在子线程中并发执行,而主线程可以在此期间进行其他操作。


💧std::future与std::promise💧  

std::promise 是 C++ 标准库中用于与 std::future 配合的一个类,用于在异步操作中设置共享状态。它允许你在一个线程中设置结果,并在另一个线程中读取这个结果。

std::promise 的作用

  • std::promise 提供了一个接口,用于设置一个异步操作的结果。它与 std::future 一起使用,std::future 用于获取这个结果。
  • 典型用法:你通常在一个线程中创建一个 std::promise 对象,并将它的 std::future 传递给另一个线程。第一个线程会设置结果,而第二个线程则会获取这个结果。
#include <iostream>
#include <thread>
#include <future>
#include <chrono>// 模拟一个耗时操作的函数
void cook_steak(std::promise<int> prom, int timesteak) 
{std::cout << "make steak" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(timesteak)); // 模拟做牛排的时间prom.set_value(1); // 设置 promise 的结果
}int main() 
{// 创建一个 promise 对象std::promise<int> prom;// 获取与 promise 相关联的 future 对象std::future<int> result = prom.get_future();// 启动线程来执行任务std::thread task_thread(cook_steak, std::move(prom), 5);// 在等待牛排的同时,可以做其他事情   每过一秒检查一次while (result.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {std::cout << "...Doing other things while waiting for the steak...\n";}// 获取异步任务的结果(即牛排是否做好)int steak_status = result.get(); // 这里会阻塞直到任务设置值if (steak_status == 1) {std::cout << "Steak is ready! Time to eat.\n";}// 确保任务线程完成task_thread.join();return 0;
}

 输出结果:

make steak
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
...Doing other things while waiting for the steak...
Steak is ready! Time to eat.

总结

  • std::promise 允许你在一个线程中设置结果,另一个线程中获取这个结果。
  • std::future 用于获取 std::promise 设置的值,并可以在需要时阻塞当前线程直到结果可用。
  • 使用 std::promisestd::future 的主要好处是它们提供了清晰的异步任务通信机制,使得任务结果的传递变得简单和安全。

四、总结 

1️⃣: 使用async()函数,是多线程操作中最简单的一种方式,不需要自己创建线程对象,并且可以得到子线程函数的返回值。

2️⃣:使用std::promise类,在子线程中可以传出返回值也可以传出其他数据,并且可选择在什么时机将数据从子线程中传递出来,使用起来更灵活。

3️⃣:使用std::packaged_task类,可以将子线程的任务函数进行包装,并且可以得到子线程的返回值。

五、共勉

以下就是我对 【C++11】异步操作 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 【C++11】 的理解,请持续关注我哦!!!      

相关文章:

【C++11】深度解析--异步操作(什么是异步?异步有那些操作?异步操作有什么用呢?)

目录 一、前言 二、什么是异步操作呢&#xff1f; &#x1f525;异步的概念&#x1f525; &#x1f525;异步的生活案例说明&#x1f525; 三、异步有那些操作呢&#xff1f; &#x1f525;std::future&#x1f525; &#x1f4a2;std::future 的概念&#x1f4a2; &a…...

PHP苹果 V X iPhone微商i o s多分开V X语音转发密友朋友圈一键跟圈软件

苹果VX神器&#xff01;iPhone微商必备&#xff1a;ios多开、VX语音转发、密友朋友圈一键跟圈软件大揭秘&#xff01; 一、iOS多开新境界&#xff0c;工作生活两不误&#xff01; 你是不是也烦恼过&#xff0c;想要在工作号和生活号之间自由切换&#xff0c;却因为iPhone的限制…...

LDR6020 iPad皮套一体式键盘充电方案解析

在移动办公与学习的浪潮中&#xff0c;iPad凭借其强大的性能与便携性&#xff0c;成为了越来越多人的首选设备。然而&#xff0c;随着工作与学习任务的日益复杂&#xff0c;单一的触控操作已难以满足高效、精准的需求。因此&#xff0c;搭配一款优秀的键盘成为了提升iPad使用体…...

一款功能强大且免费的跨平台图片批量处理工具

XnConvert是一款功能强大且免费的跨平台图片批量处理工具&#xff0c;广泛应用于个人用户、教育机构和非营利组织。它支持超过500种图片格式&#xff0c;包括常见的JPEG、PNG、TIFF、GIF、WebP、PSD、JPEG2000等&#xff0c;并能够导出为大约70种不同的文件格式。 该软件的主要…...

用Python打造精彩动画与视频,4.2 特效和滤镜的使用

第四章&#xff1a;深入MoviePy 4.2 特效和滤镜的使用 在视频制作和编辑过程中&#xff0c;特效和滤镜是不可或缺的元素。它们不仅能增强视觉效果&#xff0c;还能赋予视频独特的风格和情感。MoviePy 作为一个功能强大的视频编辑库&#xff0c;提供了多种内置的特效和滤镜&…...

在 iOS 系统中,如何设置才能更好地保护个人隐私?

在iOS系统中&#xff0c;有一些设置和功能可以帮助您更好地保护个人隐私。以下是一些建议&#xff1a; 使用设备锁&#xff1a;设置一个强密码、Touch ID或Face ID来锁定您的设备。这可以防止其他人访问您的设备和个人信息。 更新软件&#xff1a;及时更新您的iOS系统和应用程…...

Charles抓包工具系列文章(七)-- Rewrite工具的应用示例

一、背景 客户端通过域名访问后端服务,在api网关层,会判断path的前缀,默认/api开头的请求都转发至后端服务A。 当前缀是/assist/api开头,请求将转发至后端服务B(部署在192.168.80.226,便于测试对比) 在不改动kong网关配置的情况下,现需要把后者的请求转发至192.168.…...

国内SSL证书颁发机构哪家服务更优质?

SSL证书作为保障网站数据传输安全的关键工具&#xff0c;其重要性不言而喻。选择一个可靠的SSL证书代理商&#xff0c;不仅能够提供多样化的证书类型&#xff0c;而且能在众多品牌中进行比较&#xff0c;选择最适合自己的、性价比更高的产品。此外&#xff0c;优质的代理商还能…...

鸿蒙系统开发【设备安全服务-应用设备状态检测】安全

设备安全服务-应用设备状态检测 介绍 本示例向您介绍如何在应用中获取DeviceToken用于对应用的设备状态进行检测。 需要使用设备安全服务接口 kit.DeviceSecurityKit。 效果预览 Sample工程的配置与使用 在DevEco中配置Sample工程的步骤如下 [创建项目]及[应用]。打开Sam…...

19个运维工程师面试集锦

第一部分&#xff1a;Linux基础 题目1&#xff1a; 有一百个图片文件&#xff0c;它们的地址都是 http://down.xiaomi.com/img/1.png http://down.xiaomi.com/img/2.png … 一直到 http://down.xiaomi.com/img/100.png 如何批量下载这100个图片文件&#xff0c;并找出其中大…...

一芯解锁「看家」新体验,航芯高性价比猫眼智能锁方案,让安全看得见!

随着智能门锁市场规模逐年递增&#xff0c;行业“内卷”也持续激烈。伴随着一路加码的功能卖点&#xff0c;智能门锁制造商正面临着产品功能芯片增多和成本优化的双重挑战。消费者不仅追求易用性、智能化和美观性&#xff0c;更期待产品具有良好的性价比。 而在智能门锁的众多…...

IPv4 vs IPv6:了解这两大协议的关键差异

我发现&#xff0c;很多找代理IP的朋友在后台问我的问题都很相似&#xff01;都被配置IP的最后一步&#xff1a;选择IPv4还是IPv6&#xff1f;给难住了。昨晚我一晚没睡&#xff0c;终于整理出对IPv4和IPv6的对比总结&#xff0c;从概念阐述到特点对比&#xff0c;再解答IPv6总…...

C#知识|XML文件操作

哈喽,你好啊,我是雷工! 之前有朋友在群里聊XML文件操作的问题,今天正好学习相关内容, 以下为学习笔记。 01 XML介绍 ①:XML是eXtensible Markup Language的缩写,即扩展标记语言。 ②:XML是一种可以用来创建自定义的标记语言,由W3C(万维网协会)创建,用来克服HTML的局…...

TCP 和 UDP 之间的区别?

从 连接&#xff0c;可靠性&#xff0c;传输方式等方面&#xff1a; TCP 是面向连接的协议&#xff0c;在发送数据的时候需要先通过 TCP 的三次握手&#xff0c;而 UDP 是无连接的协议&#xff0c;可以直接传输数据TCP 通过超时重传&#xff0c;流量控制和拥塞控制等方法保障了…...

共用体、枚举类型、typedef定义,位运算

共用体 union 共用体名 { 数据类型1 成员变量1; 数据类型2 成员变量2; 数据类型3 成员变量3; ... }; 共用体所有成员变量&#xff0c;所占空间重叠&#xff0c;占共同的空间。 枚举 将变量的值一一列举出来。 enum 枚举类型名…...

【运维】Linux如何批量解压文件夹下的很多个`.tar.gz`文件

要在Linux中批量解压这些.tar.gz文件&#xff0c;你可以使用tar命令配合find或者bash的通配符功能。这里是一个简单的步骤来解压所有这些.tar.gz文件&#xff1a; 方法 1: 使用 find 命令 find . -type f -name "*.tar.gz" -exec tar -xzvf {} \;这个命令的意思是从…...

centos9安装jumpserver并导入域用户

jumpserver是使用最广泛的开源堡垒机&#xff0c;依赖 mysql/mariadb、postgresql、redis 3个数据库。 当前版本为 4.0.1&#xff0c;安装包&#xff1a; jumpserver-ce-v4.0.1-x86_64.tar.gz 0、安装centos9&#xff0c;安装docker 1、解压安装包 cd /opt tar -xf jumpser…...

将一批 csv 的第一行抄进 Excel

某目录下有一批结构相同的 csv 文件&#xff1a; stock_301500.csvstock_320688.csv CODE,DT,OP,CL 301500,2023-06-02,71,67.8 301500,2023-06-05,79.35,72.61 301500,2023-06-06,75.8,77.65 CODE,DT,OP,CL 320688,2023-06-02,33,32 320688,2023-06-05,28.37,30.23 320688,2…...

【传知代码】LAD-GNN标签注意蒸馏(论文复现)

近年来&#xff0c;随着图神经网络&#xff08;GNN&#xff09;在各种复杂网络数据中的广泛应用&#xff0c;如何提升其在大规模图上的效率和性能成为了研究的热点之一。在这个背景下&#xff0c;标签注意蒸馏&#xff08;Label Attention Distillation&#xff0c;简称LAD&…...

JVM调优篇:探索Java性能优化的必备种子面试题

JVM内存模型 首先面试官会询问你在进行JVM调优之前&#xff0c;是否了解JVM内存模型的基础知识。这是一个重要的入门问题。JVM内存模型主要包括程序计数器、堆、本地方法栈、Java栈和方法区&#xff08;1.7之后更改为元空间&#xff0c;并直接使用系统内存&#xff09;。 正常…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...