- 博客(20)
- 收藏
- 关注
原创 C++ 条件变量带谓词的wait(),在等待之前会执行谓词吗,还是说只有阻塞以后被唤醒才会执行谓词
这种设计是为了确保线程在进入等待状态之前和每次被唤醒后都能检查条件是否满足,从而避免虚假唤醒(spurious wakeup)的问题。这种设计确保了线程在条件真正满足时才会继续执行,避免了虚假唤醒和不必要的等待。通过在每次唤醒后检查谓词,可以确保线程只有在条件真正满足时才会继续执行。例如,如果条件已经满足,线程可以直接继续执行,而不需要进入等待状态。谓词的检查是线程安全的,因为它在持有锁的情况下执行。在进入等待状态之前检查谓词,可以避免不必要的等待。,线程不会进入等待状态,而是直接继续执行。
2025-03-02 21:04:18
150
原创 epoll服务器read()采用阻塞方式,当客户端发送数据过快时为什么服务端接收到的数据会丢失
在epoll服务器中,如果read()采用阻塞方式,当客户端发送数据过快时,服务端接收到的数据可能会丢失。
2025-02-03 15:09:10
277
原创 什么是TCP粘包
(Packet Sticking)是指在使用 TCP 协议进行数据传输时,发送方发送的多个数据包在接收方接收时被“粘”在一起,形成一个大的数据块,导致接收方无法正确区分原始的数据包边界。TCP 粘包是由于 TCP 协议本身的流式传输特性导致的,解决粘包问题需要在应用层设计协议时明确数据包的边界。TCP 默认启用了 Nagle 算法,该算法会将多个小的数据包合并成一个大的数据包发送,以减少网络中的小包数量,提高网络效率。接收方的缓冲区可能会一次性接收多个数据包,导致这些数据包在接收方看起来是“粘”在一起的。
2025-02-03 01:41:49
146
原创 Linux epoll什么情况下会自动删除其监控的文件描述符
epoll不会自动删除文件描述符,除非文件描述符被关闭或释放。在事件触发后,通常需要手动处理并从epoll实例中移除文件描述符。
2025-02-03 01:13:07
401
原创 C++类如果没有重载赋值运算符会发生什么即默认赋值行为
如果一个类没有显式重载赋值运算符,编译器会生成一个默认的赋值运算符,执行逐成员的浅拷贝。默认赋值运算符在处理指针或资源管理类时可能会导致内存泄漏、双重释放或悬空指针等问题。为了避免这些问题,可以:显式重载赋值运算符。使用拷贝-交换惯用法。禁用赋值运算符(如果不希望类支持赋值操作)。
2025-02-01 00:45:50
745
原创 C++类成员变量是如何初始化的
初始化方式适用场景示例默认初始化未显式初始化时int x;构造函数初始化列表推荐方式,高效且必须用于const和引用成员构造函数体内赋值不推荐,效率较低y = 20;就地初始化C++11 引入,简洁直观int x = 10;静态成员变量初始化静态成员变量(类外定义)
2025-02-01 00:32:41
1171
原创 C++中重载bool运算符的意义是什么
重载bool运算符的意义在于让自定义类的对象能够自然地参与布尔逻辑运算,从而提升代码的可读性和简洁性。通过合理设计,可以让类的行为更符合直觉,同时避免潜在的错误。
2025-01-31 19:20:36
592
原创 C++开发中常用的中间件有哪些
具体选择应根据项目需求和场景来决定。- **gRPC**:基于 HTTP/2 和 Protocol Buffers,高性能,支持多语言。- **Apache Kafka**:高吞吐量、分布式,适合大数据和实时数据处理。- **Cap'n Proto**:高性能,零拷贝序列化,适合低延迟场景。- **Redis**:支持多种数据结构,高性能,适合缓存和实时数据处理。- **FlatBuffers**:零拷贝序列化工具,适合高性能场景。- **ZeroMQ**:轻量级、高性能,适合低延迟场景。
2025-01-31 16:11:50
460
原创 C++中成员函数指针和普通函数指针的区别在哪
特性普通函数指针成员函数指针类型定义简单,只需函数签名需要类名和作用域调用方式直接调用通过对象实例调用(.*或->*绑定对象不需要需要底层实现直接存储函数地址存储函数地址和额外信息(如this使用场景自由函数、静态成员函数非静态成员函数与结合直接赋值需要std::bind或 Lambda。
2025-01-31 14:17:46
899
2
原创 C++ read()在阻塞和非阻塞模式下返回值的区别
6. 阻塞模式 vs 非阻塞模式行为 阻塞模式 非阻塞模式没有数据可读时 阻塞,直到有数据到达或发生错误 立即返回,errno 为 EAGAIN返回值 > 0 读取到数据 读取到数据返回值 = 0 对端关闭连接或文件末尾 对端关闭连接或文件末尾返回值 = -1 发生错误或被信号中断 发生错误、被信号中断或无数据可读
2025-01-30 13:49:37
163
原创 Linux中epoll的事件有哪些
避免惊群效应,多个 epoll 实例中只有一个唤醒。适用场景:数据到达、连接关闭、监听套接字有新连接。适用场景:多线程/进程监听同一文件描述符。适用场景:高性能场景,需状态变化时处理。适用场景:缓冲区有空闲,可以发送数据。事件触发后禁用文件描述符,需重新注册。适用场景:确保事件只被一个线程处理。防止系统休眠,直到事件处理完毕。适用场景:连接关闭或设备断开。适用场景:需防止系统休眠时。对端关闭连接或关闭写操作。适用场景:检测对端关闭。适用场景:带外数据到达。适用场景:处理错误情况。文件描述符发生错误。
2025-01-30 13:23:02
223
原创 leetcode 图DFS深度优先搜索的解题步骤
观看了视频 : Graph图DFS深度优先搜索题型套路【LeetCode刷题套路教程12】_哔哩哔哩_bilibili总结了一下图的DFS解题套路:1.初始化一个Hashset用来记录已经访问过的节点2.对于所有的入口节点,调用dfs()a.验证当前的节点,如果该节点已经访问过或者是要找的目的节点,returnb.节点的一些操作(先序遍历)c.遍历当前节点的每一个相邻节点 [ i.验证邻居...
2022-03-29 22:07:47
778
原创 终极解决方案:win11 家庭版VMware Workstation与Device/Credential Guard不兼容
终极解决方案:win11家庭版VMware Workstation与Device/Credential Guard不兼容 。
2022-03-21 21:14:25
11680
原创 C++ 创建和打印一个单链表
#include<stdio.h>#include<iostream>using std::cin;using std::cout;class Node {public: int data; Node* next; Node(int e, Node* n) { data = e; next = n; }};Node* createList(int a[],int size) { Node* head = new Node(0, NULL); .
2021-12-21 17:07:15
871
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人