溫馨提示×

linux c++多線程資源管理

小樊
102
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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女