✅ 一、std::thread
已使用 chatgpt 重构笔记结构
C++11 原生线程类
1.1 基本语法
#include <thread>
void task(int id) {
// do something
}
int main() {
std::thread t(task, 42); // 创建线程执行 task(42)
t.join(); // 等待线程结束
}
1.2 支持的任务类型
普通函数
lambda 表达式
函数对象(重载 operator())
类成员函数(需要绑定对象)
🧪 示例:绑定成员函数
class Worker {
public:
void run(int id) {
std::cout << "Thread " << id << std::endl;
}
};
Worker w;
std::thread t(&Worker::run, &w, 1); // 注意 &w
1.3 常用函数
1.4 使用建议
✅ 二、std::mutex
线程间互斥控制
2.1 基本语法
#include <mutex>
std::mutex mtx;
void task() {
mtx.lock();
// 临界区(访问共享变量)
mtx.unlock();
}
2.2 推荐用法:RAII 封装
std::lock_guard<std::mutex> lock(mtx); // 自动上锁和释放(作用域退出即释放)
2.3 支持的类
2.4 使用建议
✅ 三、std::atomic<T>
原子操作,无锁同步
3.1 基本语法
#include <atomic>
std::atomic<int> counter(0);
void add() {
counter++;
}
所有操作:load()、store()、fetch_add()、compare_exchange_weak/strong() 都是线程安全的无锁操作。
3.2 常见操作
3.3 原子类型支持
std::atomic<int/float/bool/...>(POD 类型)
std::atomic<T*>(原子指针)
std::atomic_flag(最轻量的 spin lock 原语)
std::atomicstd::shared_ptr<T>(C++20)
3.4 std::atomic_flag
最小自旋锁示例
std::atomic_flag flag = ATOMIC_FLAG_INIT;
void lock() {
while (flag.test_and_set(std::memory_order_acquire)) {}
}
void unlock() {
flag.clear(std::memory_order_release);
}
3.5 内存序(默认就是最安全的 seq_cst)
load(memory_order_relaxed)
store(memory_order_release)
fetch_add(memory_order_acq_rel)
3.6 使用建议
✅ 四、三者何时用谁?
✅ 五、常见陷阱 ⚠️
✅ 总结核心口诀:
能用 atomic 就别用锁,能用 lock_guard 就别手动 lock,能用 thread pool 就别乱开线程。
评论