温馨提示×

Linux C++怎样处理线程

小樊
46
2026-08-27 08:37:08
栏目: 编程语言

在 Linux 下用 C++ 处理线程,常见做法有三种,按“推荐程度”从高到低给你讲,并附上示例和注意事项。


✅ 一、首选方式:C++11 及以上 std::thread(最推荐)

这是现代 C++ 标准做法,跨平台、易用、安全。

1️⃣ 基本示例

#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

2️⃣ 使用 Lambda 作为线程函数

std::thread t([] {
    std::cout << "Lambda thread\n";
});
t.join();

3️⃣ 线程同步(互斥锁)

#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 原子变量

✅ 二、Linux 原生线程:pthread(了解即可)

这是 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

✅ 五、常见坑(非常重要)

❌ 1. 忘记 join 或 detach

std::thread t(worker);
// 程序会直接 terminate

✅ 必须:

t.join();
// 或
t.detach();

❌ 2. 线程访问共享数据未加锁

int count = 0;
// 多线程 ++count ❌

✅ 改成:

std::atomic<int> count{0};

❌ 3. 捕获局部变量到线程

int x = 10;
std::thread t([&x] { std::cout << x; }); // 危险

✅ 传值或保证生命周期:

std::thread t([x] { std::cout << x; });

✅ 六、总结建议

场景 推荐
普通多线程 std::thread
需要跨平台 std::thread
Linux 底层开发 pthread
高并发服务器 线程池

如果你愿意,我可以:

  • ✅ 给你写一个 完整线程池示例
  • ✅ 讲 生产者-消费者模型
  • ✅ 对比 进程 vs 线程
  • ✅ 讲 C++20 无锁队列

你现在是 学习阶段 还是 做项目

0