legongju.com
我们一直在努力
2025-01-14 18:44 | 星期二

C++线程类中如何实现线程池管理

在C++中,可以使用std::thread库来创建和管理线程。为了实现线程池管理,你需要创建一个线程池类,该类包含一组工作线程,这些线程可以执行提交给它们的任务。以下是一个简单的线程池类示例:

#include
#include
#include
#include 
#include
#include
#include

class ThreadPool {
public:
    // 构造函数,初始化线程池
    ThreadPool(size_t num_threads) {
        for (size_t i = 0; i < num_threads; ++i) {
            workers.emplace_back(&ThreadPool::work, this);
        }
    }

    // 析构函数,清理线程池
    ~ThreadPool() {
        {
            std::unique_lock lock(queue_mutex);
            stop = true;
        }
        condition.notify_all();
        for (auto& worker : workers) {
            worker.join();
        }
    }

    // 提交任务到线程池
    void submit(std::function<void()> task) {
        {
            std::unique_lock lock(queue_mutex);
            tasks.push(task);
        }
        condition.notify_one();
    }

private:
    // 工作线程函数
    void work() {
        while (true) {
            std::function task;
            {
                std::unique_lock lock(queue_mutex);
                condition.wait(lock, [this] { return stop || !tasks.empty(); });
                if (stop && tasks.empty()) {
                    return;
                }
                task = std::move(tasks.front());
                tasks.pop();
            }
            task();
        }
    }

    std::vector workers;
    std::queue> tasks;
    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop = false;
};

使用示例:

int main() {
    // 创建一个包含4个工作线程的线程池
    ThreadPool pool(4);

    // 向线程池提交10个任务
    for (int i = 0; i < 10; ++i) {
        pool.submit([i] {
            std::cout << "Task " << i << " executed by thread "<< std::this_thread::get_id()<< std::endl;
        });
    }

    // 主线程等待用户输入,以便观察线程池的工作情况
    std::cin.get();

    return 0;
}

这个示例中的ThreadPool类包含一个工作线程向量、一个任务队列、一个互斥锁和一个条件变量。构造函数初始化指定数量的工作线程,每个线程都执行work函数。work函数在无任务时等待条件变量,当有新任务时通过条件变量唤醒线程执行任务。submit函数用于向线程池提交新任务。析构函数用于清理线程池并等待所有线程结束。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/106054.html

相关推荐

  • winapi在c#图形界面开发中的作用

    winapi在c#图形界面开发中的作用

    Windows API(WinAPI)是一组用于与Windows操作系统进行交互的函数和方法 访问底层操作系统功能:WinAPI提供了对底层操作系统功能的访问,如窗口管理、文件操作、...

  • c#中winapi函数的参数传递技巧

    c#中winapi函数的参数传递技巧

    在C#中调用Windows API(WinAPI)函数时,需要注意参数的传递方式和数据类型 使用DllImport属性:在C#中调用WinAPI函数,需要使用DllImport属性来导入相应的动态...

  • 如何确保c#调用winapi的安全性

    如何确保c#调用winapi的安全性

    要确保C#调用Windows API(WinAPI)的安全性,可以采取以下措施: 使用P/Invoke:在C#中,可以使用P/Invoke(Platform Invoke)技术来调用WinAPI。这是一种允许托...

  • winapi在c#跨平台开发中的应用探讨

    winapi在c#跨平台开发中的应用探讨

    WinAPI(Windows Application Programming Interface)是Windows操作系统提供的一组编程接口,用于开发Windows应用程序。在C#中,我们可以使用WinAPI来实现跨平台...

  • 如何利用C++线程类实现分布式计算

    如何利用C++线程类实现分布式计算

    在C++中,可以使用std::thread库来实现分布式计算。std::thread允许你创建并管理线程,从而在多个处理器或核心上并行执行任务。以下是一个简单的示例,说明如何使...

  • C++线程类中如何处理异常情况

    C++线程类中如何处理异常情况

    在C++中,处理线程类中的异常情况需要谨慎对待。当在线程函数中抛出异常时,通常会导致程序崩溃或其他不可预测的行为。为了安全地处理线程类中的异常情况,你可以...

  • 如何在C++线程类中实现定时任务

    如何在C++线程类中实现定时任务

    在 C++ 中,可以使用 和 库来实现线程类中的定时任务
    #include
    #include
    #include
    #include #include class TimerThread {
    public: Ti...

  • 如何在C++中使用ANTLR进行语法解析

    如何在C++中使用ANTLR进行语法解析

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和...