温馨提示×

linux c++配置怎么配线程

小樊
36
2026-09-29 05:46:30
栏目: 编程语言

在 Linux 下用 C++ 配置/使用线程,通常有三种主流方式。下面按从常见到进阶给你讲,并附示例。


一、最推荐:C++11 标准线程(std::thread)

不需要额外库,跨平台,Linux 原生支持

1️⃣ 编译方式

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

⚠️ -pthread 一定要加(Linux 下必须)


2️⃣ 基本示例

#include <iostream>
#include <thread>

void worker(int id) {
    std::cout << "线程 " << id << " 运行中\n";
}

int main() {
    std::thread t1(worker, 1);
    std::thread t2(worker, 2);

    t1.join();
    t2.join();

    return 0;
}

3️⃣ 常用配置(线程属性)

std::thread 本身不能直接设置栈大小 / 优先级,需要配合系统 API:

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

int main() {
    std::thread t([]{
        // 线程逻辑
    });

    // 获取底层 pthread
    pthread_t native = t.native_handle();
    // 可调用 pthread_attr_*
}

二、Linux 原生线程(POSIX Thread,pthread)

更接近系统层,可控性强

1️⃣ 编译

g++ main.cpp -pthread

2️⃣ 示例

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

void* thread_func(void* arg) {
    int id = *(int*)arg;
    std::cout << "pthread " << id << "\n";
    return nullptr;
}

int main() {
    pthread_t tid;
    int id = 1;
    pthread_create(&tid, nullptr, thread_func, &id);
    pthread_join(tid, nullptr);
}

3️⃣ 配置线程属性(重点)

pthread_attr_t attr;
pthread_attr_init(&attr);

// 设置栈大小
pthread_attr_setstacksize(&attr, 1024 * 1024); // 1MB

// 设置分离状态
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&tid, &attr, thread_func, nullptr);
pthread_attr_destroy(&attr);

三、线程池(实际项目常用)

不要自己频繁创建线程

推荐库

  • ✅ std::async
  • ✅ std::future
  • ✅ 第三方:
    • ThreadPool(单头文件)
    • boost::asio
    • libevent

示例(std::async)

#include <future>
#include <iostream>

int compute() {
    return 42;
}

int main() {
    auto f = std::async(std::launch::async, compute);
    std::cout << f.get() << "\n";
}

四、线程数量怎么配?

一般经验:

CPU 核心线程数 = std::thread::hardware_concurrency()
unsigned n = std::thread::hardware_concurrency();
  • CPU 密集:≈ 核心数
  • IO 密集:可多于核心数

五、常见问题

❌ 忘记 -pthread
❌ 线程函数传引用出错
❌ 忘记 join() 导致崩溃
❌ 共享变量未加锁


如果你愿意,可以告诉我:

  • ✅ 是 服务器 / 客户端 / 嵌入式
  • ✅ 是否要 高并发 / 实时
  • ✅ 用 C++11 / 17 / 20

我可以直接给你最优线程架构方案。

0 踩