【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::async
、std::promise
和std::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::async
、std::promise
和 std::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::async
、std::launch::deferred
,或者是它们的组合。std::launch::async
:在新线程中异步执行任务。std::launch::deferred
:延迟执行任务,直到调用future
的get
或wait
成员函数。
f
:要执行的函数。args
:传递给函数f
的参数。
返回值
返回一个 std::future
对象,用于获取异步任务的结果。
异步任务的启动策略
std::launch::async
:强制在新线程中异步执行任务。std::launch::deferred
:延迟执行任务,直到调用std::future
的get
或wait
成员函数。- 默认行为:如果未指定
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::promise
和std::future
的主要好处是它们提供了清晰的异步任务通信机制,使得任务结果的传递变得简单和安全。
四、总结
1️⃣: 使用async()函数,是多线程操作中最简单的一种方式,不需要自己创建线程对象,并且可以得到子线程函数的返回值。
2️⃣:使用std::promise类,在子线程中可以传出返回值也可以传出其他数据,并且可选择在什么时机将数据从子线程中传递出来,使用起来更灵活。
3️⃣:使用std::packaged_task类,可以将子线程的任务函数进行包装,并且可以得到子线程的返回值。
五、共勉
以下就是我对 【C++11】异步操作 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 【C++11】 的理解,请持续关注我哦!!!
相关文章:
【C++11】深度解析--异步操作(什么是异步?异步有那些操作?异步操作有什么用呢?)
目录 一、前言 二、什么是异步操作呢? 🔥异步的概念🔥 🔥异步的生活案例说明🔥 三、异步有那些操作呢? 🔥std::future🔥 💢std::future 的概念💢 &a…...
PHP苹果 V X iPhone微商i o s多分开V X语音转发密友朋友圈一键跟圈软件
苹果VX神器!iPhone微商必备:ios多开、VX语音转发、密友朋友圈一键跟圈软件大揭秘! 一、iOS多开新境界,工作生活两不误! 你是不是也烦恼过,想要在工作号和生活号之间自由切换,却因为iPhone的限制…...
LDR6020 iPad皮套一体式键盘充电方案解析
在移动办公与学习的浪潮中,iPad凭借其强大的性能与便携性,成为了越来越多人的首选设备。然而,随着工作与学习任务的日益复杂,单一的触控操作已难以满足高效、精准的需求。因此,搭配一款优秀的键盘成为了提升iPad使用体…...
一款功能强大且免费的跨平台图片批量处理工具
XnConvert是一款功能强大且免费的跨平台图片批量处理工具,广泛应用于个人用户、教育机构和非营利组织。它支持超过500种图片格式,包括常见的JPEG、PNG、TIFF、GIF、WebP、PSD、JPEG2000等,并能够导出为大约70种不同的文件格式。 该软件的主要…...
用Python打造精彩动画与视频,4.2 特效和滤镜的使用
第四章:深入MoviePy 4.2 特效和滤镜的使用 在视频制作和编辑过程中,特效和滤镜是不可或缺的元素。它们不仅能增强视觉效果,还能赋予视频独特的风格和情感。MoviePy 作为一个功能强大的视频编辑库,提供了多种内置的特效和滤镜&…...
在 iOS 系统中,如何设置才能更好地保护个人隐私?
在iOS系统中,有一些设置和功能可以帮助您更好地保护个人隐私。以下是一些建议: 使用设备锁:设置一个强密码、Touch ID或Face ID来锁定您的设备。这可以防止其他人访问您的设备和个人信息。 更新软件:及时更新您的iOS系统和应用程…...
Charles抓包工具系列文章(七)-- Rewrite工具的应用示例
一、背景 客户端通过域名访问后端服务,在api网关层,会判断path的前缀,默认/api开头的请求都转发至后端服务A。 当前缀是/assist/api开头,请求将转发至后端服务B(部署在192.168.80.226,便于测试对比) 在不改动kong网关配置的情况下,现需要把后者的请求转发至192.168.…...
国内SSL证书颁发机构哪家服务更优质?
SSL证书作为保障网站数据传输安全的关键工具,其重要性不言而喻。选择一个可靠的SSL证书代理商,不仅能够提供多样化的证书类型,而且能在众多品牌中进行比较,选择最适合自己的、性价比更高的产品。此外,优质的代理商还能…...
鸿蒙系统开发【设备安全服务-应用设备状态检测】安全
设备安全服务-应用设备状态检测 介绍 本示例向您介绍如何在应用中获取DeviceToken用于对应用的设备状态进行检测。 需要使用设备安全服务接口 kit.DeviceSecurityKit。 效果预览 Sample工程的配置与使用 在DevEco中配置Sample工程的步骤如下 [创建项目]及[应用]。打开Sam…...
19个运维工程师面试集锦
第一部分:Linux基础 题目1: 有一百个图片文件,它们的地址都是 http://down.xiaomi.com/img/1.png http://down.xiaomi.com/img/2.png … 一直到 http://down.xiaomi.com/img/100.png 如何批量下载这100个图片文件,并找出其中大…...
一芯解锁「看家」新体验,航芯高性价比猫眼智能锁方案,让安全看得见!
随着智能门锁市场规模逐年递增,行业“内卷”也持续激烈。伴随着一路加码的功能卖点,智能门锁制造商正面临着产品功能芯片增多和成本优化的双重挑战。消费者不仅追求易用性、智能化和美观性,更期待产品具有良好的性价比。 而在智能门锁的众多…...
IPv4 vs IPv6:了解这两大协议的关键差异
我发现,很多找代理IP的朋友在后台问我的问题都很相似!都被配置IP的最后一步:选择IPv4还是IPv6?给难住了。昨晚我一晚没睡,终于整理出对IPv4和IPv6的对比总结,从概念阐述到特点对比,再解答IPv6总…...
C#知识|XML文件操作
哈喽,你好啊,我是雷工! 之前有朋友在群里聊XML文件操作的问题,今天正好学习相关内容, 以下为学习笔记。 01 XML介绍 ①:XML是eXtensible Markup Language的缩写,即扩展标记语言。 ②:XML是一种可以用来创建自定义的标记语言,由W3C(万维网协会)创建,用来克服HTML的局…...
TCP 和 UDP 之间的区别?
从 连接,可靠性,传输方式等方面: TCP 是面向连接的协议,在发送数据的时候需要先通过 TCP 的三次握手,而 UDP 是无连接的协议,可以直接传输数据TCP 通过超时重传,流量控制和拥塞控制等方法保障了…...
共用体、枚举类型、typedef定义,位运算
共用体 union 共用体名 { 数据类型1 成员变量1; 数据类型2 成员变量2; 数据类型3 成员变量3; ... }; 共用体所有成员变量,所占空间重叠,占共同的空间。 枚举 将变量的值一一列举出来。 enum 枚举类型名…...
【运维】Linux如何批量解压文件夹下的很多个`.tar.gz`文件
要在Linux中批量解压这些.tar.gz文件,你可以使用tar命令配合find或者bash的通配符功能。这里是一个简单的步骤来解压所有这些.tar.gz文件: 方法 1: 使用 find 命令 find . -type f -name "*.tar.gz" -exec tar -xzvf {} \;这个命令的意思是从…...
centos9安装jumpserver并导入域用户
jumpserver是使用最广泛的开源堡垒机,依赖 mysql/mariadb、postgresql、redis 3个数据库。 当前版本为 4.0.1,安装包: jumpserver-ce-v4.0.1-x86_64.tar.gz 0、安装centos9,安装docker 1、解压安装包 cd /opt tar -xf jumpser…...
将一批 csv 的第一行抄进 Excel
某目录下有一批结构相同的 csv 文件: 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标签注意蒸馏(论文复现)
近年来,随着图神经网络(GNN)在各种复杂网络数据中的广泛应用,如何提升其在大规模图上的效率和性能成为了研究的热点之一。在这个背景下,标签注意蒸馏(Label Attention Distillation,简称LAD&…...
JVM调优篇:探索Java性能优化的必备种子面试题
JVM内存模型 首先面试官会询问你在进行JVM调优之前,是否了解JVM内存模型的基础知识。这是一个重要的入门问题。JVM内存模型主要包括程序计数器、堆、本地方法栈、Java栈和方法区(1.7之后更改为元空间,并直接使用系统内存)。 正常…...
常见的内存泄漏及其解决方案
内存泄漏是Java开发中一个常见且令人头疼的问题,即使在使用垃圾回收机制的Java中,也无法完全避免内存泄漏的出现。当对象不再需要时却仍然占据着内存,导致内存使用量不断增加,最终可能导致 OutOfMemoryError。本文将深入探讨Java中…...
SQLSERVER 触发器记录表某个字段更新记录
想要记录该字段的原值和现有值,触发器写法: CREATE TRIGGER tr_UpdateEmployeeDepartment ON Employees AFTER UPDATE AS BEGINSET NOCOUNT ON; -- 避免多余的计数消息IF UPDATE(Department) -- 检查是否更新了 Department 字段BEGININSERT INTO Update…...
现代前端架构介绍(第一部分):App是如何由不同的构建块构成的
远离JavaScript疲劳和框架大战,了解真正重要的东西 几周前,我的同事们对我们的前端架构、代码结构和面临的挑战很感兴趣。在做了几次关于如何构建可扩展且健壮的前端的演讲后,我觉得把它们都总结一下并与社区分享我们的策略是一个不错的主意。…...
Android 11 关于按键拦截/按键事件处理分享
系统在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java处理按键事件,不管是物理按键还是 SystemUI的nav_bar上的虚拟按键(使用了KeyEvent类中的,比如:KeyEvent.KEYCODE_VOLUME_UP). 主要注意的有两个函数: interceptKeyBef…...
最新TomatoIDC开源虚拟主机销售系统源码/有插件系统模块+模版系统
源码简介: 最新TomatoIDC开源虚拟主机销售系统源码,它有一个方便扩展的插件和模版系统模块,使用实用。 TomatoIDC,一款遵循GPL3.0协议的开源虚拟主机销售系统,不仅有着可以轻松扩展的插件系统和模版系统,…...
简单的docker学习 第4章docker容器
第4章 Docker容器 4.1 容器基础 4.1.1 容器启动流程 通过 docker run 命令可以启动运行一个容器。该命令在执行时首先会在本地查找指定的镜像,如果找到了,则直接启动,否则会到镜像中心查找。如果镜像中心存在该镜像,则会下载到…...
PHP中如何声明数组
数组是一种数据结构,用于存储一系列的值或对象,这些值或对象可以通过索引(或键)来访问。在PHP中,数组是一种复合类型的数据结构,可以存储多个值,这些值可以是整型、字符串、布尔值,甚…...
JavaScript前端面试题——fetch
什么是fetch? fetch:fetch是浏览器内置的api,用于发送网络请求 ajax&axios&fetch的关系 ajax:ajax 是一种基于原生 JavaScript 的异步请求技术。它使用 XMLHttpRequest 对象来发送请求和接收响应。 axios:…...
在Qt中获取Windows中进程的PID
主要是用到了系统自带的工具【tasklist.exe】 利用 QProcess调用这个tasklist有一点坑,已经在代码中指出了。 指定为csv格式输出的话,在后处理时比较方便。 QList<quint64> listProcessIdentifier(QString processName) {QProcess process;QStrin…...
8.1-java+tomcat环境的配置+代理
一、回顾 1.安装nodejs,这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行…...
阿里云网站怎么备案域名解析/预防电信网络诈骗
在Shell脚本中要经常做各种测试,测试语句的格式:(1)test (2) [](3) [[]]三种的区别,在第三种中可以进行通配符的匹配,而且&&,||,,操作符也可以正常的存在[[]]中,但是不能存在[]中。文件测试操作…...
pc开奖网站开发/网址缩短在线生成器
来源是:Text at LEFT如何更改CSS以使两个DIV看起来像?----------------------|Text at LEFT | ####|| | ####|| | ####|| | || | |----------------------即。文本在左侧DIV左上角,图像在右侧DIV右上方对齐。更新:我使用的是&…...
网络运营者应当对其收集的用户信息严格保密/专业seo关键词优化
通过加速,国内用户能够快速访问最流行的 Docker 镜像。 仓库 registry.docker-cn.com 包含流行的公有镜像。私有镜像仍需要从 Docker Hub 镜像库中拉取。 以下命令直接从镜像加速地址进行拉取: $ docker pull registry.docker-cn.com/myname/myrepo:myta…...
建设银行网银官方网站/网站关键词怎么优化到首页
Windows server 2008 搭建服务 英文全称是“Virtual Private Network”,就是“虚拟专用网络”。 虚拟专用网络就是一种虚拟出来的企业内部专用线路、这条隧道可以对数据进行几倍加密达到安全使用互联网的目的。此项技术已被广泛使用、虚拟专用网可以帮助远程用户、公…...
固始城乡建设局的网站怎么打不开了/2023年的新闻时事热点论文
题目来自lwn的一个带有嘲讽的针对性评论。该文链接如下: https://lwn.net/Articles/808503/ 针对该评论的回应如下: A heavy reliance on BPF is not a bad thing in and out of itself. It makes me remember the GCC scenario: it made pluggability…...