温馨提示×

如何入门linux c++并发

小樊
37
2026-10-02 03:18:38
栏目: 编程语言

入门 Linux 下 C++ 并发编程,可以按“基础 → 系统 → 标准库 → 实战”的路径来走。下面给你一份比较清晰的学习路线和资源建议。


一、先打基础(很重要)

1. C++ 基础

确保你熟悉:

  • 指针、引用
  • 类与对象
  • RAII(资源管理)
  • 模板基础

推荐:

  • 《C++ Primer》(前 12 章足够)
  • 在线:https://en.cppreference.com

2. 操作系统基础(Linux 并发的底层)

理解“为什么需要并发”:

  • 进程 vs 线程
  • 上下文切换
  • 用户态 / 内核态
  • 系统调用

推荐了解:

  • ps, top, htop
  • strace, lsof

二、Linux 系统级并发(理解底层)

1. POSIX 线程(pthread)

先用 pthread 理解线程本质:

#include <pthread.h>
#include <iostream>

void* thread_func(void* arg) {
    std::cout << "Hello from thread\n";
    return nullptr;
}

int main() {
    pthread_t t;
    pthread_create(&t, nullptr, thread_func, nullptr);
    pthread_join(t, nullptr);
}

编译:

g++ test.cpp -pthread

学习重点:

  • pthread_create
  • pthread_join
  • mutex
  • cond

推荐:

  • 《UNIX 环境高级编程(APUE)》
  • man pages:man pthread_create

三、C++ 标准库并发(重点)

1. std::thread

现代 C++ 推荐从这里开始:

#include <thread>
#include <iostream>

void foo() {
    std::cout << "thread\n";
}

int main() {
    std::thread t(foo);
    t.join();
}

2. 互斥与同步

  • std::mutex
  • std::lock_guard
  • std::unique_lock
  • std::condition_variable

示例:

std::mutex m;
std::condition_variable cv;
bool ready = false;

void worker() {
    std::unique_lock<std::mutex> lock(m);
    cv.wait(lock, []{ return ready; });
}

3. 原子操作

  • std::atomic
  • 理解内存模型(relaxed / acquire / release)

4. 异步任务

  • std::async
  • std::future
  • std::promise

四、并发模型与实战

1. 常见并发模型

  • 多线程 + 锁
  • 线程池
  • 生产者 / 消费者
  • Reactor / Proactor(网络)

2. 写一个线程池(很重要)

建议自己实现:

  • 任务队列
  • 工作线程
  • 条件变量同步

这是“真正理解并发”的转折点。


五、调试与工具(Linux 必备)

  • gdb / gdb multi-thread
  • valgrind --tool=helgrind
  • perf
  • thread sanitizer:
g++ -fsanitize=thread

六、推荐学习资料

书籍

  • 《C++ Concurrency in Action》(必读)
  • 《Linux 多线程服务端编程》(陈硕)
  • 《APUE》

视频

  • B站:C++ 并发 / Linux 系统编程
  • CPPCon(YouTube)

七、学习顺序建议(总结)

  1. C++ 基础
  2. pthread(理解线程)
  3. std::thread / mutex
  4. condition_variable / atomic
  5. 线程池
  6. 调试工具
  7. 项目实战(如简单服务器)

如果你愿意,我可以:

  • 给你一份 30 天学习计划
  • 或直接带你 从 0 写一个线程池
  • 或结合 Linux 网络并发 来讲

你更想从哪一步开始?

0 踩