首页 > 其他分享 >线程池

线程池

时间:2024-01-22 19:22:05浏览次数:29  
标签:std tasks lock 任务 线程 cv

目录


简单的线程池

在 C++11 中,你可以使用 std::thread 和 std::mutex 等标准库来实现一个简单的线程池。以下是一个简单的示例代码:

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <queue>

class ThreadPool {
private:
    // 线程池大小
    size_t poolSize;
    // 任务队列
    std::queue<std::function<void()>> tasks;
    // 锁
    std::mutex mtx;
    // 条件变量
    std::condition_variable cv;
    // 线程数
    size_t numThreads;

public:
    ThreadPool(size_t poolSize) : poolSize(poolSize), numThreads(0) {}

    void addTask(const std::function<void()> &task) {
        std::unique_lock<std::mutex> lock(mtx);
        tasks.push(task);
        // 通知一个等待的线程
        cv.notify_one();
    }

    ~ThreadPool() {
        // 等待所有任务完成
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{return tasks.empty();});
    }

private:
    void worker() {
        for (;;) {
            std::function<void()> task;
            {
                std::unique_lock<std::mutex> lock(mtx);
                // 等待任务
                cv.wait(lock, []{return !tasks.empty();});
                task = tasks.front();
                tasks.pop();
            }
            // 执行任务
            task();
        }
    }
};

int main() {
    ThreadPool pool(4);

    for (int i = 0; i < 10; ++i) {
        pool.addTask([]() { std::cout << "Task " << i << " is running on thread " << std::this_thread::get_id() << std::endl; });
    }

    pool.addTask([]() { std::cout << "All tasks are done" << std::endl; });

    std::vector<std::thread> threads;
    for (size_t i = 0; i < pool.poolSize; ++i) {
        threads.push_back(std::thread(&ThreadPool::worker, &pool));
    }

    for (auto &thread : threads) {
        thread.join();
    }

    return 0;
}

在上面的示例中, ThreadPool 类有以下几个关键部分:

  • poolSize 表示线程池的大小。
  • tasks 是一个任务队列,使用 std::queue 实现。
  • mtx 是一个互斥锁,用于保护任务队列的访问。
  • cv 是一个条件变量,用于通知等待的线程有任务可用。
  • numThreads 表示当前运行的线程数。
    在 addTask 方法中,使用 std::unique_lock 来获取互斥锁,并将任务添加到任务队列中。然后,使用 cv.notify_one 通知一个等待的线程。
    在 worker 方法中,使用循环不断等待任务。在循环中,使用 std::unique_lock 来获取互斥锁,并使用 cv.wait 等待条件变量的信号。当有任务可用时,从队列中取出任务并执行。
    在 main 函数中,创建一个线程池,并向其添加多个任务。最后,启动所有的线程,并等待所有任务完成。
    请注意,这只是一个简单的线程池实现示例,可能不适用于所有情况。在实际应用中,你可能需要根据具体需求进行调整和优化。

标签:std,tasks,lock,任务,线程,cv
From: https://www.cnblogs.com/yubo-guan/p/17980800

相关文章

  • java线程池-1
    1.概述Java线程的创建非常昂贵,需要JVM和OS(操作系统)配合完成大量的工作:必须为线程堆栈分配和初始化大量内存块,其中包含至少1MB的栈内存。需要进行系统调用,以便在OS(操作系统)中创建和注册本地线程。Java高并发应用频繁创建和销毁线程的操作将是非常低效的,而且是不被......
  • python 多线程multiprocessing
    该多线程,简单计算结果可以使用,在django里想并行处理多个实体进行计算不行,请自行验证importmultiprocessing#要在进程池中并行执行的任务函数defprocess_data(data):#执行任务的逻辑result=data*2returnresultif__name__=='__main__':#创......
  • C#中Dictionary与ConcurrentDictionary解锁多线程操作安全之道
     使用C#中的Dictionary与ConcurrentDictionary进行多线程操作在C#中,Dictionary是一个常见的字典类型,但它不是线程安全的。为了在多线程环境中确保安全的操作,我们可以使用ConcurrentDictionary,这是一个专门设计用于多线程场景的线程安全字典。1.使用Dictionary进行非线程安......
  • 多线程笔记
    线程创建继承Thread类//线程创建方式1:继承thread1,重写run方法,调用start开启线程publicclassThread1extendsThread{@Overridepublicvoidrun(){//run方法线程体for(inti=0;i<20;i++){System.out.println("我在看代......
  • PHP学习第八天:扩展开发与多线程编程
    在PHP学习的第八天,我深入了解了扩展开发和多线程编程的概念。早上,我学习了如何编写PHP扩展。扩展是PHP的模块,可以提供额外的功能。我了解了扩展开发的基础知识,如C语言和PHPAPI。通过编写一个简单的扩展,我熟悉了扩展的结构和编写过程。了解扩展开发使我能够更深入地了解PHP的内部工......
  • 并发编程之多线程理论篇
    什么叫线程线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程自己不用有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个一个进程的其他线程共享其所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个......
  • 并发编程之守护线程
    无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁需要强调的是:运行完毕并非终止运行#1.对主进程来说,运行完毕指的是主进程代码运行完毕#2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕#1主进程在其代码结束后就......
  • 并发编程之多线程操作篇
    多线程简单介绍多线程,或者说多任务,指的是操作系统同时运行多个任务。例如,听歌、洗衣服、看视频可以同时进行,这种就是多任务。单核CPU执行多任务:操作系统轮流让各个任务交替执行,任务1执行t1时间,切换到任务2,任务2执行t2时间,再切换到任务3,执行t3时间...如此反复执行,表面上看,每个任......
  • 线程异步操作
    目录什么是C++中的异步操作?std::async异步调用函数什么是C++中的异步操作?在C++中,异步操作是指在程序执行期间,可以同时执行多个任务,而无需等待前一个任务完成。这种并发执行的方式可以提高程序的性能和响应速度。C++中的异步操作通常通过多线程或异步任务来实现。使用std::asyn......
  • 什么是进程/线程/协程
    这实在是一个过于经典的面试题,尤其是对于go开发者来说,毕竟go有协程这种杀手级的东西,面试官就更爱问这个问题了同时网上相关资料很杂,本身这种抽象概念的理解就没有绝对的标准表达,大家领会意思就够了,哈哈,但带来的问题就是查找相关资料的时候容易把自己越看越乱所以此处我写的内容......