在 Linux 下用 C++ 处理线程,常见做法有三种,按“推荐程度”从高到低给你讲,并附上示例和注意事项。
std::thread(最推荐)这是现代 C++ 标准做法,跨平台、易用、安全。
#include <iostream>
#include <thread>
void worker(int id) {
std::cout << "Thread " << id << " is running\n";
}
int main() {
std::thread t1(worker, 1);
std::thread t2(worker, 2);
t1.join();
t2.join();
return 0;
}
编译(必须加 -pthread):
g++ -std=c++11 thread.cpp -pthread
std::thread t([] {
std::cout << "Lambda thread\n";
});
t.join();
#include <mutex>
std::mutex mtx;
void safe_print() {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Safe output\n";
}
常用同步工具:
| 类型 | 用途 |
|---|---|
std::mutex |
互斥锁 |
std::lock_guard |
RAII 锁 |
std::unique_lock |
可手动控制 |
std::condition_variable |
条件变量 |
std::atomic |
原子变量 |
这是 POSIX 线程,C 风格,Linux 下非常底层。
#include <pthread.h>
#include <iostream>
void* worker(void* arg) {
int id = *(int*)arg;
std::cout << "Thread " << id << "\n";
return nullptr;
}
int main() {
pthread_t t1, t2;
int a = 1, b = 2;
pthread_create(&t1, nullptr, worker, &a);
pthread_create(&t2, nullptr, worker, &b);
pthread_join(t1, nullptr);
pthread_join(t2, nullptr);
}
编译:
g++ pthread.cpp -pthread
✅ 优点:细粒度控制
❌ 缺点:不现代、易出错、不跨平台
Linux 的 clone() / fork() 一般用于进程或底层实现,不适合普通线程编程。
如果是服务器 / 高并发程序,建议用线程池,而不是频繁创建线程。
常见方案:
Boost.Asio, libevent)std::thread t(worker);
// 程序会直接 terminate
✅ 必须:
t.join();
// 或
t.detach();
int count = 0;
// 多线程 ++count ❌
✅ 改成:
std::atomic<int> count{0};
int x = 10;
std::thread t([&x] { std::cout << x; }); // 危险
✅ 传值或保证生命周期:
std::thread t([x] { std::cout << x; });
| 场景 | 推荐 |
|---|---|
| 普通多线程 | ✅ std::thread |
| 需要跨平台 | ✅ std::thread |
| Linux 底层开发 | pthread |
| 高并发服务器 | 线程池 |
如果你愿意,我可以:
你现在是 学习阶段 还是 做项目?