• vector

    std::vector 是 C++ 标准模板库 (STL) 中最常用的序列容器之一。它提供了动态数组的功能,允许在运行时动态调整大小,并且支持高效的随机访问。 12#include <vector>std::vector<T> vector_name; - T: 存储的元素类型。 常用接口 获取元素 std::vector 提供了多种方式来获取元素: - o...
  • 线程池

    线程池 (Thread Pool) 是一种并发设计模式,它预先创建并维护一组可复用的工作线程,而不是在需要时才创建新线程。这些线程“池化”在一起,等待执行分配给它们的任务。 它的核心思想是将“任务的提交”与“任务的执行”解耦。应用程序的各个部分可以将任务提交给线程池,而无需关心任务具体由哪个线程执行、何时执行。 一个典型的线程池包含以下几个关键部分: - 任务队列 (std::que...
  • 异步/并发编程模型

    在C++并发编程中,核心挑战之一是在不同线程间安全、高效地传递数据。特别是当一个线程(生产者/Provider)需要将一个计算结果(值或异常)传递给另一个线程(消费者/Consumer)时。std::future, std::promise, std::packaged_task, 和 std::async 共同构成了一个异步编程模型,其设计哲学是关注点分离 (Separation of...
  • 条件变量和多线程数据共享

    条件变量 (Condition Variable) 是一种同步原语,它允许一个或多个线程等待(阻塞),直到另一个线程修改了某个共享状态并通知它们。 它的核心思想不是为了“锁住”资源,而是提供一种“等待-通知” (Wait-Notify) 机制。线程可以高效地等待某个特定条件 (Condition) 变为真,而无需通过循环不断地检查(这种低效的方式称为忙等待 (Busy-Waitin...
  • std::call_once 解决多线程数据共享

    在多线程环境中,我们经常会遇到一个需求:确保某段代码(通常是初始化代码)在整个程序的生命周期中,无论有多少个线程并发调用它,都只被执行一次。一个经典的例子就是线程安全的懒汉式单例模式 (Lazy-Initialized Singleton)。 12345678910111213141516#include <iostream>class Singleton {public: ...
  • 互斥量和原子操作解决多线程数据共享

    在多个线程中共享数据时,需要注意线程安全问题。如果多个线程同时访问同一个变量,并且其中至少有一个线程对该变量进行了写操作,那么就会出现数据竞争问题。 数据竞争可能会导致程序崩溃、产生未定义的结果,或者得到错误的结果。为了避免数据竞争问题,需要使用同步机制来确保多个线程之间对共享数据的访问是安全的。常见的同步机制包括互斥量、条件变量、原子操作等。 互斥量 问题的根源:竞争条件 (Race...
  • Thread线程库中的资源问题

    在单线程程序中,对象的创建和销毁顺序是可预测的。但在多线程程序中,新线程的执行时机是不确定的。它可能在创建它的函数返回之前、之中或之后才真正开始运行。“数据未定义错误”的根源就是,程序员错误地假设了新线程会比它所需要的数据“死”得更早,但事实往往相反。 下面这些问题的本质原因在于: 线程的生命周期与其访问的数据的生命周期不匹配,导致线程访问了无效的内存 数据未定义的情况 传递临时变量...
  • Thread线程库的基本使用

    C++11 标准的发布是一个里程碑,它首次将线程支持纳入了标准库。这意味着开发者终于可以编写跨平台的、标准化的多线程程序了。 在使用 std::thread 之前,必须包含头文件 : #include <thread> 创建和启动线程 在 C++11 中,创建一个 std::thread 对象的同时,新线程就已经开始执行了, 同时主线程立即、不阻塞地继续往下执行,新线...
  • 条款36 :如果异步是必要的,则指定 std::launch::async

    该条款的核心论点是,std::async 的默认启动策略虽然为标准库调度器提供了有用的灵活性,但也给程序员带来了不确定性,可能导致难以发现的bug。因此,当你确实需要函数必须异步执行时,就应该明确指定这一点。 std::async 的启动策略 std::async 可以接受一个启动策略参数,来控制任务的执行方式: - std::launch::async:此策略保证任务会在一个不同的...
  • 条款35 :优先选用基于任务而非基于线程的程序设计

    该条款的核心观点是,当需要异步运行一个函数时,使用 std::async 的基于任务 (task-based) 的方法,通常优于直接使用 std::thread 的基于线程 (thread-based) 的方法。 基于线程 (Thread-based) 与 std::thread std::thread 是 C++ 标准库中对操作系统线程 (Thread) 的直接封装。线程可以...
1101112131421