linux

linux c++多线程资源管理

小樊
82
2024-12-04 02:19:53
栏目: 编程语言

在 Linux 中,C++ 多线程资源管理是一个重要的话题

  1. 互斥锁(Mutex):互斥锁是一种同步机制,用于确保多个线程在访问共享资源时不会发生冲突。C++11 提供了 std::mutex 类来实现互斥锁。使用 std::lock_guardstd::unique_lock 可以简化锁的管理。
#include <mutex>

std::mutex mtx; // 全局互斥锁

void thread_function() {
    std::lock_guard<std::mutex> lock(mtx); // 自动加锁
    // 访问共享资源
}
  1. 条件变量(Condition Variable):条件变量是一种同步机制,用于在多个线程之间传递信息。C++11 提供了 std::condition_variable 类来实现条件变量。使用 std::unique_lock 可以简化锁的管理。
#include <condition_variable>

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

void thread_function1() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, []{ return ready; }); // 等待条件满足
    // 处理共享资源
}

void thread_function2() {
    std::unique_lock<std::mutex> lock(mtx);
    ready = true;
    cv.notify_one(); // 通知等待的线程
}
  1. 线程池(Thread Pool):线程池是一种管理线程的资源管理技术。它可以避免频繁地创建和销毁线程,从而提高性能。C++ 中可以使用第三方库(如 ThreadPoolcpp-taskflow)来实现线程池。
#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>

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

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

    template <typename F, typename... Args>
    void enqueue(F&& f, Args&&... args) {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            tasks.emplace([f, args...] { f(args...); });
        }
        cv.notify_one();
    }

private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;
    std::mutex queue_mutex;
    std::condition_variable cv;
    bool stop = false;
};
  1. 智能指针(Smart Pointers):智能指针是一种自动管理内存的资源管理技术。C++11 提供了 std::shared_ptrstd::unique_ptr 等智能指针类型。在多线程环境中,使用智能指针可以避免内存泄漏和竞争条件。
#include <memory>

std::shared_ptr<int> shared_data = std::make_shared<int>(0);
std::mutex mtx;

void thread_function() {
    std::unique_lock<std::mutex> lock(mtx);
    // 访问共享资源
    *shared_data += 1;
}

总之,在 Linux 中使用 C++ 进行多线程编程时,需要注意资源管理,包括互斥锁、条件变量、线程池和智能指针等技术的使用。这些技术可以帮助你编写高效、安全的并发程序。

0
看了该问题的人还看了