温馨提示×

Linux C++如何配置线程

小樊
33
2026-08-16 00:46:41
栏目: 编程语言

在 Linux 下使用 C++ 配置和管理线程,常见方式有三种:POSIX 线程(pthread)C++11 标准线程(std::thread)、以及线程池。下面从最常用、推荐的方式开始讲,并给出配置示例。


一、推荐方式:C++11 std::thread(现代、跨平台)

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;
}

编译:

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

⚠️ 一定要加 -pthread,否则可能链接失败。


2️⃣ 线程配置(常用)

✅ 设置线程名称(Linux)

#include <pthread.h>

pthread_setname_np(pthread_self(), "worker-thread");

✅ 设置线程栈大小

#include <thread>
#include <pthread.h>

int main() {
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setstacksize(&attr, 2 * 1024 * 1024); // 2MB

    std::thread t([] {
        // 线程任务
    });

    pthread_attr_destroy(&attr);
    t.join();
}

3️⃣ 线程同步

互斥锁(mutex)

#include <mutex>

std::mutex mtx;

void safe_print() {
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << "safe\n";
}

条件变量

#include <condition_variable>

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

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

二、POSIX 线程(pthread,偏底层)

适合对线程行为有精细控制(如调度策略、CPU 亲和性)

示例

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

void* worker(void* arg) {
    std::cout << "pthread running\n";
    return nullptr;
}

int main() {
    pthread_t tid;
    pthread_create(&tid, nullptr, worker, nullptr);
    pthread_join(tid, nullptr);
}

编译:

g++ pthread_demo.cpp -pthread

三、线程池(高并发推荐)

简单线程池思路

  • 固定数量线程
  • 任务队列
  • 条件变量通知

适合服务器、音视频、计算密集型程序。

如果你需要,我可以直接给你一个完整可用线程池实现


四、常见配置项总结

配置项 方法
线程数量 自己控制 / std::thread::hardware_concurrency()
线程名称 pthread_setname_np
栈大小 pthread_attr_setstacksize
CPU 亲和性 sched_setaffinity
优先级 pthread_setschedparam
分离线程 std::thread::detach()

五、常见问题

❓ 线程数设多少合适?

  • CPU 密集型:CPU 核心数
  • IO 密集型:核心数 × 2 ~ 4
unsigned int n = std::thread::hardware_concurrency();

❓ 线程异常怎么办?

  • 线程中捕获异常
  • 或使用 std::future

六、我可以继续帮你

你可以告诉我:

  • ✅ 是 服务器 / 嵌入式 / 桌面程序
  • ✅ 是否需要 高并发 / 实时性
  • ✅ 是否需要 线程池 / 任务队列

我可以直接给你生产级线程配置示例

0