- 博客(38)
- 收藏
- 关注
原创 【C++】std::make_shared 详解
用于异步任务执行。它封装一个可调用对象(函数、lambda 表达式等),并允许获取其执行结果。是 C++11 标准引入的一个函数模板,用于创建。对象,并高效地分配和管理对象的内存。但实际上,标准库的实现比这更复杂,因为它优化了。具有更好的性能和异常安全性。:C++11/14 不支持。里面是要创建的对象类型。是 C++11 引入的。
2025-03-18 17:38:00
1141
原创 【C++多线程】C++异步线程池提交任务的写法和解释
基础知识点包括:右值、右值引用、完美转发、智能指针、Lambda表达式、可调用对象包装器function<void()>、绑定器bind、future、packaged_task问题1:函数名(F&& f, Args&&… args) 这里的形参是啥意思?在 这个函数的入参部分: 采用了一种 完美转发(Perfect Forwarding) 机制,主要是为了高效地传递参数,并保持参数的值类别(左值/右值)属性。主要是为了 提高泛型代码的效率,并 避免不必要的拷贝。如果直接使用:那么:使用 的
2025-03-18 17:25:43
618
原创 【C++】vector中emplace_back的用法
容器销毁:超出作用域或析构时。元素移除pop_backerase等操作。内存重新分配容量不足时,旧对象被移动后销毁。容器清空clear()调用时。异常:构造失败不影响已有对象,重新分配失败保持状态。
2025-03-17 08:09:42
730
原创 【C++】如果想要bind的返回值类型是function<void()>应该怎么办
要让std::bind的返回值类型是使用std::bind绑定原始函数及其所有参数,使其成为无参数的可调用对象。将结果赋值给。确保返回类型是void,否则需要调整函数逻辑。如果你有具体的函数或场景需要帮助实现,请告诉我,我可以进一步协助!
2025-03-17 07:26:30
333
原创 【C++多线程】packaged_task的入参(可调用对象)分类
在 C++ 中,可以接受多种下面分别介绍这些可调用对象如何与配合使用。可以封装多种可调用对象,包括普通函数、匿名函数(Lambda)、仿函数(重载operator()的类)、类对象转换为函数指针、静态成员函数和非静态成员函数。
2025-03-16 14:30:19
180
原创 【C++多线程】thread
是C++11引入的线程库的一部分,提供了创建和管理线程的能力。它封装了操作系统的线程接口,使得在C++中更方便地进行多线程编程。:如果主线程退出而分离线程还未执行完,可能会导致未定义行为。,否则可能导致数据竞争(race condition)等问题。命名空间下,用于表示一个独立执行的线程对象。提供了多个构造函数,允许不同方式创建线程。等同步机制来解决这些问题。
2025-03-16 13:35:00
575
原创 【C++多线程】async
std::async定义在头文件<future>std::async是一个函数模板,用于启动异步任务,并返回一个对象,该对象可用于查询任务状态或获取结果。policy:决定任务的执行策略,可选::强制异步执行,即在新线程中执行任务。:懒加载模式,即任务会在get()或wait()调用时才执行。(默认值):由系统决定是否创建新线程。f:要调用的函数。args...:传递给f的参数。,其中T是f的返回类型。std::async是 C++ 标准库提供的异步执行方式,可用于创建并执行异步任务。
2025-03-16 13:20:36
317
原创 【C++多线程】C++线程池实现
/ 创建线程池,使用系统支持的并发线程数。// 构造函数,初始化线程池。// 模拟耗时任务的函数。// 线程池的工作线程。// 提交任务到线程池。// 等待所有任务完成。// 获取任务队列大小。// 调整线程池大小。// 获取线程池大小。
2025-03-16 12:21:44
794
原创 【C++重要!!!】赋值与初始化的区别
在C++中,区分赋值(assignment)和初始化(initialization)是一个非常重要的问题,因为它们在语义、调用时机和涉及的函数上有着本质的区别。您的提问源于对代码行为(如拷贝构造函数和赋值运算符)的观察,下面我会详细解释两者的定义、区别、代码示例,并结合您之前的 类进行说明。初始化(Initialization):赋值(Assignment):在代码中,区分赋值和初始化主要看对象是否已经存在以及语法上下文。这些都是在对象声明时进行的操作,触发构造函数。注意: 看起来像赋值,但它是拷贝
2025-03-15 06:01:33
1027
原创 【linux网络编程】关于套接字编程中文件描述符对应的读写缓冲区
在C/C++的套接字编程中,文件描述符(file descriptor)对应的“write buffer”(写缓冲区)通常指的是操作系统内核为每个套接字(socket)维护的发送缓冲区(send buffer)。这个缓冲区并不是用户程序直接管理的内存区域,而是由TCP/IP协议栈在内核中分配和管理的。以下是对套接字文件描述符与写缓冲区的详细讲解,包括其工作原理、相关API以及如何操作。当你调用或时,数据并不是立刻发送到网络,而是被拷贝到内核的写缓冲区中。TCP协议栈会根据网络状况(如窗口大小、拥塞控制)逐步
2025-03-09 01:23:57
299
原创 【linux网络编程】套接字编程API详细介绍
函数功能返回值类型主要结构体socket()创建套接字int无bind()绑定地址intsockaddrlisten()开始监听int无accept()接受连接intsockaddrconnect()发起连接intsockaddrsend()发送数据ssize_t无recv()接收数据ssize_t无close()关闭套接字int无这些API是C语言网络编程的核心,配合结构体(如)使用,可以实现基本的客户端-服务器通信。需要注意网络字节序(htonsntohshtonlntohl)和错误处理(
2025-03-09 00:06:48
1048
原创 【linux网络编程】套接字socket
的端点,是应用程序访问网络的接口,用于在不同计算机或同一计算机的进程之间通信。:在应用程序和网络协议之间建立连接,允许数据收发。,它允许不同计算机或同一计算机上的进程通过。
2025-03-08 23:06:54
559
原创 【linux网络编程】字节序
所有数据在发送前都要转换为网络字节序(大端),无论是客户端还是服务器。接收数据后,需要转换回主机字节序,保证程序能够正确解析数据。使用htonl()htons()进行发送转换,ntohl()ntohs()进行接收转换,确保跨平台兼容性。
2025-03-08 22:50:47
717
原创 【linux网络编程】浏览网页时客户端与服务器之间数据交互的完整过程
,然后按下回车,计算机(客户端)与服务器之间会进行一系列复杂的交互,最终将网页呈现出来。),然后按下回车,计算机(客户端)与服务器之间会进行一系列复杂的交互,最终将网页呈现出来。,通常会等待 2 * MSL(最大报文生存时间,通常是 30s~120s)。当网页加载完成,客户端和服务器的连接可能会被关闭(如果。,这个过程不像建立连接(三次握手)那样简单,而是需要。“我收到了你的关闭请求,但我还没准备好关闭连接。“我不再发送数据了,但我还能接收你的数据。“我收到了你的关闭请求,连接正式断开。
2025-03-08 22:00:41
835
原创 【linux网络编程】端口
是用来标识不同进程或服务的逻辑通信端点。它类似于一座大楼的房间号,帮助操作系统和网络协议区分不同的应用程序,以便正确地传输数据。端口管理是服务器安全和网络优化的重要部分,合理使用端口可以提高系统的安全性和性能。在网络通信中,IP地址用于标识主机,而端口用于区分同一主机上的多个服务。端口号的作用是确保数据包可以正确地发送到特定的应用程序或服务。如果不想被扫描,可以关闭不必要的端口,或者使用防火墙限制访问。,以确定数据要发送到哪个应用程序。在服务器或网络设备上,可以使用。规则来控制端口访问。
2025-03-08 21:49:00
1093
原创 【C++多线程】条件变量condition_variable(2)
不会有 race condition(竞争条件)。进入等待之间,不会有其他线程插入操作,导致。),而是高效地等待信号,并正确获取。线程不会 “忙等待”(不断检查。线程还没进入等待状态。
2025-03-08 17:11:22
938
原创 【C++多线程】条件变量condition_variable(1)
互斥量只负责保护数据的访问,不能用来通知其他线程状态的变化。让线程可以高效等待某个条件,避免忙等待带来的性能浪费。它们通常配合使用,依赖mutex来保护共享数据的状态。因此,即使有了互斥量,在需要线程同步的场景下,我们仍然需要来高效地协调线程的执行顺序。想象一个餐厅点餐的场景,我们用它来类比mutex和的作用。场景描述顾客点餐后需要等待厨师做好饭。厨师在顾客点餐之前是不会做饭的。顾客不能频繁去后厨查看饭是不是好了,否则会很麻烦。当饭做好后,厨师会通知顾客来取饭。不用,仅用mutex。
2025-03-08 17:00:58
551
原创 【C++多线程】std::future
std::async是一个函数模板,用于启动一个异步任务。它会返回一个对象,通过这个对象可以获取任务的结果或状态。std::async的核心思想是将任务的执行与调用线程解耦,允许任务在后台运行(可能在新线程中,也可能是延迟执行)。是一个类模板,表示一个异步操作的未来结果。它通常与std::async或配合使用,提供了一种机制来获取异步任务的结果或状态。
2025-03-08 16:02:03
920
原创 【C++多线程】std::shared_future
在C++中,是的共享版本,允许多个线程等待同一个异步任务的结果。相比于(它的get()只能调用一次),允许多个线程调用get()并获取相同的结果。
2025-03-08 10:40:57
166
原创 【C++多线程】promise
使用和一起实现一个线程。这个例子中,主线程会启动一个工作线程,工作线程计算一个结果,并通过promise将结果传递给future,然后主线程获取并打印结果。
2025-03-08 09:16:22
229
原创 【C++多线程异步】std::packaged_task实际应用案例--线程池
在这个例子中,我们实现一个简单的任务队列,生产者将任务放入队列,线程池中的工作线程从队列中取出任务并执行。好的,我将对上述代码进行逐行详细解释,帮助你理解每个部分的实现逻辑和作用。通常用于需要将任务与结果分离、异步执行并手动管理线程的场景。,这是许多高并发系统中常见的模式。我们将模拟一个简单的任务处理系统,展示。如果你对某部分有疑问或需要更深入的分析,请告诉我!如何在多线程环境中使用。
2025-03-08 04:20:08
665
原创 【C++多线程异步】std::packaged_task
在 C++ 中,是一个非常有用的工具,用于将一个可调用对象(函数、lambda 表达式等)封装起来,并将其执行结果与一个关联,从而支持异步操作。它是 C++11 引入的<future>库的一部分,适用于需要异步执行任务并获取结果的场景。下面我会详细讲解的用法,包括其定义、功能和示例。int(int)intint<future>get()以下是一个简单的例子,展示如何使用。
2025-03-08 04:17:48
426
原创 【C++多线程】atomic
在多线程环境下,如果多个线程同时访问和修改同一个变量,可能会出现。,如果涉及多个变量的同步(如同时更新两个变量),还是需要。为了避免这个问题,可以使用。的操作,保证多个线程不会同时修改。:不涉及锁的持有,不会出现死锁问题。如果多个线程同时执行,可能导致。:避免了锁的开销,适合高并发场景。是非常常用的,尤其是在涉及。,导致程序行为不可预测。,从而提高线程安全性和性能。:线程不会因等待锁而被阻塞。这些单一数据的共享访问,如果你的程序主要涉及。
2025-03-08 03:20:26
252
原创 【C++】如何让一个类作为可调用对象被thread调用?
存储可调用对象(比如 Lambda 或仿函数),然后传给。在 C++ 中,可以让一个类对象作为。,建议使用 std::bind。需要额外的参数,可以用。使类的实例可直接调用。绑定成员函数和对象。作为可调用对象,并让。
2025-03-07 04:07:06
1060
原创 【C++】可调用对象包装器function<void()> 和 bind
std::bind在 C++11 及之后,和std::bind提供了一种灵活的方式来存储和调用可调用对象(函数、成员函数、Lambda 等),它们是现代 C++ 设计模式的重要组成部分。
2025-03-07 04:05:43
338
原创 数据链路层
数据链路层 无确认无连接服务:通常用于实时通信或误码率比较低的通信信道,也就是说源主机在发送数据的时候不用跟目的主机建立链路连接,而且目的主机收到数据帧的时候也不需要返回确认,如果帧丢失了,数据链路层也不负责重发,而直接交给上一层处理,那这种服务其实是不太负责的,但是为了实时的通信、为了更快,就要有这种服务。 有确认无连接服务:事先不需要建立连接,但是目的主机在收到数据的时候必须要返回一个确认,那如果源主机发现在规定时间内没有收到确认信号,源主机就会把刚才没有收到确认的数据帧重新传输一次,这样
2020-08-14 19:02:01
285
原创 计算机网络第二章物理层
物理层 在二进制码元中,一个比特对应一个码元。 二进制信号指的是二进制码元,也就是一个码元对应一个比特;如果是四进制信号,四进制信号指的就是有四种码元,或者说四种信号波形,一个四进制码元对应两个比特。...
2020-08-13 21:56:42
140
原创 C语言字符串
字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 string.h 中。一、字符串常量和字符数组1.1、什么是字符串常量C 语言虽然没有字符串类型,但是 C语言提是存在字符串这个概念的,也就是字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。字符串常量是不可被修改的,一般用一对双引号(" ")括起的一串字符来表示字符串常量,如:“Hell
2020-08-06 12:27:06
238
原创 初始化链表
初始化链表#include <stdio.h>#include <stdlib.h>typedef struct Link { int elem; struct Link* next;}link;link* initLink();void display(link* p);int main() { //初始化链表(1,2,3,4) printf("初始化链表为:\n"); link* p = initLink();
2020-08-03 14:20:36
4072
原创 C++提高编程
C++提高编程本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用1 模板1.1 模板的概念模板就是建立通用的模具,大大提高复用性模板的特点:模板不可以直接使用,它只是一个框架模板的通用并不是万能的1.2 函数模板C++另一种编程思想称为 泛型编程 ,主要利用的技术就是模板C++提供两种模板机制:函数模板和类模板1.2.1 函数模板语法函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。语法:
2020-07-28 16:02:17
357
1
原创 C++核心编程
函数名可以相同,提高复用性同一个作用域下函数名称相同函数参数类型不同或者个数不同或者顺序不同函数的返回值不可以作为函数重载的条件//函数重载需要函数都在同一个作用域下cout << "func 的调用!" << endl;cout << "func (int a) 的调用!" << endl;cout << "func (double a)的调用!" << endl;cout << "func (int a ,double b) 的调用!" << endl;
2020-07-28 16:02:06
711
2
原创 C++基础入门
C++基础入门1.3 变量作用:给一段指定的内存空间起名,方便操作这段内存语法:数据类型 变量名 = 初始值;示例:#include<iostream>using namespace std;int main() { //变量的定义 //语法:数据类型 变量名 = 初始值 int a = 10; cout << "a = " << a << endl; system("pause"); return 0;}注意
2020-07-28 16:01:58
712
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人