溫馨提示×

C++中如何利用線程池庫進行任務調度

c++
小樊
131
2024-09-06 10:37:59
欄目: 編程語言

在 C++ 中,可以使用線程池庫來進行任務調度。這里我們將介紹一個簡單的線程池庫,并展示如何使用它來調度任務。

首先,需要安裝線程池庫。在 Ubuntu 系統下,可以通過以下命令安裝:

sudo apt-get install libboost-all-dev

接下來,創建一個名為 thread_pool.cpp 的文件,然后編寫以下代碼:

#include<iostream>
#include<boost/asio.hpp>
#include<boost/bind.hpp>
#include<boost/thread.hpp>

class ThreadPool {
public:
    ThreadPool(size_t num_threads) : work_(io_service_) {
        for (size_t i = 0; i < num_threads; ++i) {
            threads_.create_thread(boost::bind(&boost::asio::io_service::run, &io_service_));
        }
    }

    ~ThreadPool() {
        io_service_.stop();
        threads_.join_all();
    }

    template<typename F>
    void enqueue(F f) {
        io_service_.post(f);
    }

private:
    boost::asio::io_service io_service_;
    boost::asio::io_service::work work_;
    boost::thread_group threads_;
};

void task1() {
    std::cout << "Task 1 is running in thread "<< boost::this_thread::get_id()<< std::endl;
}

void task2() {
    std::cout << "Task 2 is running in thread "<< boost::this_thread::get_id()<< std::endl;
}

int main() {
    ThreadPool pool(4); // 創建一個包含 4 個線程的線程池

    pool.enqueue(task1); // 將任務 1 添加到線程池
    pool.enqueue(task2); // 將任務 2 添加到線程池

    return 0;
}

在這個例子中,我們創建了一個名為 ThreadPool 的類,它使用 boost::asio::io_serviceboost::thread_group 來管理線程。ThreadPool 類提供了一個 enqueue 方法,用于將任務添加到線程池。

我們定義了兩個簡單的任務 task1task2,并在 main 函數中創建了一個包含 4 個線程的線程池。然后,我們將這兩個任務添加到線程池中。

要編譯這個程序,請使用以下命令:

g++ -o thread_pool thread_pool.cpp -lboost_system -lboost_thread -pthread

最后,運行生成的可執行文件:

./thread_pool

輸出結果類似于:

Task 1 is running in thread 140396678533888
Task 2 is running in thread 140396678533376

這表明任務已經在線程池中的線程上運行。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女