跳转到内容

C++ 多线程概述

来自代码酷

C++多线程概述[编辑 | 编辑源代码]

多线程是现代编程中提高程序性能的重要技术手段,它允许程序同时执行多个任务。在C++中,多线程支持通过标准库<thread>及相关组件实现。本章将详细介绍C++多线程的基本概念、核心组件及实际应用。

什么是多线程?[编辑 | 编辑源代码]

多线程是指在一个进程中创建多个执行流(线程),这些线程共享进程的资源(如内存空间),但拥有独立的调用栈和程序计数器。与单线程程序相比,多线程程序可以:

  • 并行处理任务:利用多核CPU提高计算效率。
  • 提高响应性:例如在GUI程序中,主线程处理用户交互,后台线程执行耗时操作。

线程 vs 进程[编辑 | 编辑源代码]

特性 线程 进程
资源占用 共享进程内存 独立内存空间
创建开销 较小 较大
通信方式 共享变量/同步原语 IPC(管道、套接字等)

C++多线程核心组件[编辑 | 编辑源代码]

C++11起引入的标准库支持多线程编程,主要包含以下头文件:

  • <thread>:线程管理
  • <mutex>:互斥锁
  • <condition_variable>:条件变量
  • <future>:异步操作

基本线程示例[编辑 | 编辑源代码]

以下代码展示如何创建并运行线程:

#include <iostream>
#include <thread>

void hello() {
    std::cout << "Hello from thread!\n";
}

int main() {
    std::thread t(hello); // 创建线程
    t.join();             // 等待线程结束
    return 0;
}

输出:

Hello from thread!

线程同步[编辑 | 编辑源代码]

多线程共享资源时需解决竞态条件问题。C++提供多种同步机制:

互斥锁(Mutex)[编辑 | 编辑源代码]

#include <mutex>
#include <thread>

std::mutex mtx;
int counter = 0;

void increment() {
    mtx.lock();
    ++counter;
    mtx.unlock();
}

使用RAII的lock_guard[编辑 | 编辑源代码]

更安全的锁管理方式:

void safe_increment() {
    std::lock_guard<std::mutex> lock(mtx);
    ++counter; // 自动释放锁
}

实际应用案例[编辑 | 编辑源代码]

并行计算示例[编辑 | 编辑源代码]

计算斐波那契数列的并行版本:

#include <vector>
#include <future>

int fib(int n) {
    if (n < 2) return n;
    return fib(n-1) + fib(n-2);
}

int main() {
    std::vector<std::future<int>> futures;
    for (int i = 0; i < 10; ++i) {
        futures.push_back(std::async(std::launch::async, fib, i));
    }
    for (auto &f : futures) {
        std::cout << f.get() << " ";
    }
}

线程通信[编辑 | 编辑源代码]

通过条件变量实现生产者-消费者模型:

graph LR Producer-->|push data|Buffer Buffer-->|notify|Consumer Consumer-->|wait|Buffer

std::condition_variable cv;
std::mutex mtx;
std::queue<int> data_queue;

void producer() {
    while (true) {
        std::lock_guard<std::mutex> lock(mtx);
        data_queue.push(42);
        cv.notify_one();
    }
}

void consumer() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return !data_queue.empty(); });
        int data = data_queue.front();
        data_queue.pop();
    }
}

性能考量[编辑 | 编辑源代码]

多线程编程需注意:

  • 线程开销:线程创建/销毁成本
  • 虚假共享:多个线程频繁修改同一缓存行的不同变量
  • 锁粒度:过粗降低并行性,过细增加锁开销

数学上,Amdahl定律描述了并行加速上限: S=1(1p)+pn 其中p为并行部分比例,n为处理器数量。

总结[编辑 | 编辑源代码]

C++多线程编程提供了强大的并发工具,但需要谨慎处理同步问题。关键点包括:

  • 使用std::thread管理线程生命周期
  • 通过互斥锁保护共享数据
  • 条件变量实现线程间通信
  • 异步操作简化并行任务

掌握这些概念后,开发者可以构建高效、响应迅速的多线程应用程序。