插件窝 干货文章 C++中Linux多线程怎样实现

C++中Linux多线程怎样实现

线程 std mutex include 585    来源:    2025-05-09

C++中Linux多线程实现详解

在Linux环境下,C++提供了多种实现多线程编程的方式。以下是主要的实现方法:

1. POSIX线程(pthread)

POSIX线程是Linux系统原生的线程接口,需要包含<pthread.h>头文件。

基本用法

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

void* threadFunction(void* arg) {
    std::cout << "Hello from thread!" << std::endl;
    return nullptr;
}

int main() {
    pthread_t threadId;
    int ret = pthread_create(&threadId, nullptr, threadFunction, nullptr);

    if(ret != 0) {
        std::cerr << "Thread creation failed" << std::endl;
        return 1;
    }

    pthread_join(threadId, nullptr); // 等待线程结束
    return 0;
}

线程同步

#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* threadSafeFunction(void* arg) {
    pthread_mutex_lock(&mutex);
    // 临界区代码
    pthread_mutex_unlock(&mutex);
    return nullptr;
}

2. C++11标准线程库

C++11引入了<thread>头文件,提供了跨平台的线程支持。

基本用法

#include <thread>
#include <iostream>

void threadFunction() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(threadFunction);
    t.join(); // 等待线程结束
    return 0;
}

带参数的线程函数

void printMessage(const std::string& message) {
    std::cout << message << std::endl;
}

int main() {
    std::thread t(printMessage, "Hello from thread with args!");
    t.join();
    return 0;
}

3. 线程同步机制

互斥锁(mutex)

#include <mutex>
#include <thread>

std::mutex mtx;

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

条件变量(condition_variable)

#include <condition_variable>
#include <mutex>

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

void worker() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, []{ return ready; });
    // 工作代码
}

void master() {
    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_all();
}

4. 线程池实现

#include <vector>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>

class ThreadPool {
public:
    ThreadPool(size_t numThreads) : stop(false) {
        for(size_t i = 0; i < numThreads; ++i) {
            workers.emplace_back([this] {
                while(true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(queueMutex);
                        condition.wait(lock, [this] { return stop || !tasks.empty(); });
                        if(stop && tasks.empty()) return;
                        task = std::move(tasks.front());
                        tasks.pop();
                    }
                    task();
                }
            });
        }
    }

    template<class F>
    void enqueue(F&& f) {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            tasks.emplace(std::forward<F>(f));
        }
        condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            stop = true;
        }
        condition.notify_all();
        for(std::thread &worker : workers)
            worker.join();
    }

private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;
    std::mutex queueMutex;
    std::condition_variable condition;
    bool stop;
};

5. 最佳实践

  1. 资源管理:使用RAII(Resource Acquisition Is Initialization)模式管理线程资源
  2. 避免数据竞争:合理使用互斥锁和其他同步机制
  3. 线程安全设计:尽量减少共享数据,使用消息传递等方式
  4. 异常处理:确保线程中的异常不会导致程序崩溃
  5. 性能考虑:避免过度创建线程,考虑使用线程池

6. 编译选项

使用g++编译时,需要链接pthread库:

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

以上是Linux下C++多线程编程的主要实现方式,根据具体需求选择合适的方法。C++11标准线程库提供了更现代、更安全的接口,推荐优先使用。