上一页 1 2 3 4 5 6 7 ··· 33 下一页
摘要: 容器体系结构 STL 容器的整体分类 C++ STL 中的容器可以分为三大类: 容器类型 代表容器 简介 序列容器 vector, deque, list, array, forward_list 元素按插入顺序排列 关联容器 set, map, multiset, multimap 自动排序、基于 阅读全文
posted @ 2025-07-20 19:31 _Sylvan 阅读(36) 评论(0) 推荐(0)
摘要: 原子操作和原子类型 原子操作是不可分割的操作,任何线程不会观察到操作“中间态”。如果读取操作是原子的,那么读取到的值要么是初始值,要么是某次完整修改后的值。 非原子操作可能出现“半完成”状态,导致数据竞争和未定义行为。 标准原子类型 标准原子类型定义在 <atomic> 中,操作都是原子的。 is_ 阅读全文
posted @ 2025-07-20 19:31 _Sylvan 阅读(42) 评论(0) 推荐(0)
摘要: unordered_set std::unordered_set 是一个 存储唯一元素 的集合容器,其特点是: 元素无序(内部使用哈希表) 不允许重复元素 插入、查找、删除操作的 平均时间复杂度为 O(1) 典型使用场景: 判断是否存在某元素(查重) 快速去重 实现集合的“集合运算”:并集、交集、差 阅读全文
posted @ 2025-07-20 19:31 _Sylvan 阅读(142) 评论(0) 推荐(0)
摘要: unordered_map std::unordered_map 是 C++11 引入 的关联容器,实现了 哈希表(Hash Table)。它基于key-value 对存储数据,通过哈希函数将 key 映射到桶数组(bucket)的位置,支持快速插入、查找、删除。 底层原理 数据结构 底层主要由: 阅读全文
posted @ 2025-07-20 19:31 _Sylvan 阅读(145) 评论(0) 推荐(0)
摘要: 简化代码 使用 future 的函数化编程 函数化编程简介 函数化编程(Functional Programming,FP)是一种编程范式,强调函数的纯粹性。纯函数的特点是: 函数结果只依赖于传入的参数; 对相同的输入参数,多次调用函数都会得到相同的结果; 函数不会改变任何外部状态。 C++标准库中 阅读全文
posted @ 2025-07-20 19:30 _Sylvan 阅读(34) 评论(0) 推荐(0)
摘要: C++内存模型 内存模型涉及两个方面: 内存布局(即对象如何映射到内存) 并发执行中的内存访问规则 并发编程中,特别是底层的原子操作和内存位置管理非常关键。由于C++中的所有对象都和内存地址紧密相关,因此理解对象与内存位置的关系是基础。 对象和内存位置 对象 是C++程序中的基本数据构成单元。 标准 阅读全文
posted @ 2025-07-20 19:30 _Sylvan 阅读(88) 评论(0) 推荐(0)
摘要: 限时等待与时钟 阻塞调用会将线程挂起一段不确定时间,直到事件发生。一般情况下这种方式很合适,但有时需要限定等待时间,比如发送“我还存活”的心跳,或者用户可以取消等待。 超时等待通常有两种方式: 时间段(duration):指定等待时长,比如等待30毫秒。 时间点(time point):指定具体的绝 阅读全文
posted @ 2025-07-20 19:29 _Sylvan 阅读(243) 评论(0) 推荐(0)
摘要: Future和异步任务 当在等待某个异步事件(比如机场广播通知登机)时,这种事件对应C++中的 future。future 用于表示某个操作的结果将在未来某个时间可用,线程可以等待这个结果。 C++标准库中有两种 future: std::future<T>:独占所有权,只能有一个对象持有该结果。 阅读全文
posted @ 2025-07-20 19:29 _Sylvan 阅读(27) 评论(0) 推荐(0)
摘要: 线程等待与条件变量 想象下在夜间乘火车下车,有三种选择: 整夜保持清醒 → 持续检查,浪费资源。 设置闹钟 → 有延迟风险(误差/早醒/电池无电)。 司机到站通知你 → 最理想,对应线程条件变量。 这三种方案类比线程等待事件的方式: 持续轮询 + 加锁 会造成 CPU 消耗 + 锁竞争。 间歇休眠( 阅读全文
posted @ 2025-07-20 19:29 _Sylvan 阅读(34) 评论(0) 推荐(0)
摘要: 保护共享数据的方式 互斥量是一种通用的保护共享数据机制,但不是唯一方式。特定情况下,可以用更合适的手段保障共享数据安全。 一种极端情况是共享数据只读且需要保护初始化过程。这时对数据初始化的保护是必要的,但初始化后加锁访问会带来性能开销。 C++标准为保护共享数据初始化提供了专门机制。 保护共享数据的 阅读全文
posted @ 2025-07-20 19:28 _Sylvan 阅读(30) 评论(0) 推荐(0)
摘要: 互斥量保护共享数据 在并发环境下保护共享数据的核心方法之一,就是使用互斥量(mutex)。本文围绕 C++ 标准库中的 std::mutex、std::lock_guard、std::scoped_lock、std::unique_lock 等工具展开,涵盖互斥的基本操作、接口陷阱、死锁问题与避免策 阅读全文
posted @ 2025-07-20 19:28 _Sylvan 阅读(20) 评论(0) 推荐(0)
摘要: 共享数据与条件竞争 在多线程编程中,共享数据的访问和修改是最容易引发问题的地方。如果共享数据只是只读,那么所有线程都能安全地访问这些数据,不会引起冲突;但一旦一个或多个线程尝试修改共享数据,就可能产生严重的问题,需要格外小心,确保所有线程都能正确工作。 不变量(Invariants) 不变量是指在程 阅读全文
posted @ 2025-07-20 19:28 _Sylvan 阅读(19) 评论(0) 推荐(0)
摘要: 线程标识 获取线程标识的两种方式 通过 std::thread 对象获取 std::thread t([]{ /* do something */ }); std::thread::id id = t.get_id(); 如果 std::thread 没有绑定线程,get_id() 返回默认构造的 阅读全文
posted @ 2025-07-20 19:27 _Sylvan 阅读(28) 评论(0) 推荐(0)
摘要: 确定线程数量 C++标准库中的std::thread::hardware_concurrency()函数非常实用,它返回系统支持的并发线程数,通常是CPU的核心数或者硬件线程数。如果无法获取,返回值为0。 方面 物理核心 逻辑核心(硬件线程) 本质 实际的CPU核心 核心上模拟的多线程执行单元 性能 阅读全文
posted @ 2025-07-20 19:27 _Sylvan 阅读(58) 评论(0) 推荐(0)
摘要: 转移所有权 在 C++ 中,std::thread 是一个资源占有类型,它的行为类似于 std::unique_ptr:可移动,但不可复制。这样设计的目的,是为了确保线程的所有权始终只有一个明确的拥有者,避免多线程并发错误。 为什么要支持移动? 当我们创建线程并希望将线程的所有权传递给其他对象(比如 阅读全文
posted @ 2025-07-20 19:27 _Sylvan 阅读(30) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 7 ··· 33 下一页