温馨提示×

linux c++怎么处理线程

小樊
42
2026-09-20 10:27:12
栏目: 编程语言

在 Linux 下用 C++ 处理线程,常见有 三种层级 的做法,从底层到现代:


一、最底层:POSIX 线程(pthread)✅ 基础必懂

Linux 原生线程接口。

1. 创建线程

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

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

int main() {
    pthread_t tid;
    pthread_create(&tid, nullptr, thread_func, nullptr);
    pthread_join(tid, nullptr);
    return 0;
}

编译:

g++ main.cpp -lpthread

2. 常用函数

  • pthread_create
  • pthread_join(等待)
  • pthread_detach(分离)
  • pthread_mutex_*(互斥锁)
  • pthread_cond_*(条件变量)

✅ 优点:贴近系统
❌ 缺点:C 风格,容易出错


二、推荐方式:C++11 标准线程(std::thread)⭐ 最常用

1. 基本使用

#include <thread>
#include <iostream>

void func(int x) {
    std::cout << "x = " << x << "\n";
}

int main() {
    std::thread t(func, 10);
    t.join();  // 必须 join 或 detach
}

编译(C++11+):

g++ main.cpp -std=c++11 -pthread

2. 线程同步

互斥锁

#include <mutex>

std::mutex mtx;

void safe() {
    std::lock_guard<std::mutex> lock(mtx);
    // 临界区
}

条件变量

#include <condition_variable>

std::condition_variable cv;
bool ready = false;

cv.wait(lock, []{ return ready; });
cv.notify_one();

✅ 优点:跨平台、现代、安全
✅ 推荐默认使用


三、高级方式:线程池 / 异步(项目级)

1. std::async

#include <future>

auto f = std::async([]{ return 42; });
int r = f.get();

2. 线程池(自己写或库)

  • 任务队列 + 固定线程数
  • 常用于服务器、后台任务

四、Linux 特有注意事项 ⚠️

  1. 必须链接 pthread
    -pthread
    
  2. 线程数量受 ulimit -u 限制
  3. 信号处理要小心(信号是进程级)
  4. 多线程中 fork() 很危险

五、选择建议 ✅

场景 推荐
学习 / 底层 pthread
普通程序 std::thread
高性能服务 线程池
简单异步 std::async

如果你愿意,我可以:

  • 给你一个 完整线程池示例
  • 讲 互斥锁 vs 自旋锁
  • 或针对 服务器 / 游戏 / 嵌入式 给方案

你现在是哪种使用场景?

0 踩