【C++】【条件变量】实现一个线程池及任务队列完成复用

1、引入头文件及创建任务队列、锁和条件变量

#include <iostream>
#include <functional>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <unistd.h>

std::queue<std::function<void()>> taskQueue;
std::mutex mtx;
std::condition_variable cv; // 条件变量,用于线程间的通信

1)其中functional头文件用于表示函数对象的类模板;unistd.h是linux系统定义符号常量的头文件

2)std::function<void()> 这个用来表示一个返回类型为void,无参数的函数

2、创建线程函数及任务函数

void WorkerThread() {
    while (true) {
        std::function<void()> task;
        {
            std::unique_lock<std::mutex> lock(mtx);
 			// 等待任务队列不为空
       		cv.wait(lock, []{ return !taskQueue.empty(); });
     		// 从队列中取出任务执行
            task = taskQueue.front();
            taskQueue.pop();
        }
        std::thread::id threadID = std::this_thread::get_id();
	    std::cout << "Inside Thread :: Thread ID : " << threadID << "\n";
        task(); // 执行任务
    }
}

// 定义一个函数类型,用于包装特定的任务
void MyFun(int i) {
    std::cout << "执行内容,任务编号:" << i << std::endl;
    sleep(3);
}

1)cv.wait等待两个条件一个是锁一个是队列不为空,当两个条件全部满足时,直接往下执行;当队列为空时,第二个条件不满足,会释放锁,开始阻塞等待。直到其他线程notify_one或notify_all来通知该线程,然后重新判断第二个条件,如果为真,这时开始等待锁,等抢占到锁,开始往下执行。

3、主函数

int main() {
    int numTasks = 20;
    int numThreads = 5;
    std::vector<std::thread> threads;

    for (int i = 0; i < numThreads; ++i) {
        threads.emplace_back(WorkerThread);
    }

    for (int i = 0; i < numTasks; ++i) {
        // 创建一个Lambda函数,将任务添加到队列中
        std::function<void()> task = [i] {
            MyFun(i); // 调用封装的函数
        };

        {
            std::unique_lock<std::mutex> lock(mtx);
            taskQueue.push(task);
            cv.notify_one();
        }
    }
    
    for (auto& thread : threads) {
        thread.join();
    }

    return 0;
}

1)  std::function<void()> task = [i] {
            MyFun(i); // 调用封装的函数
        };      这句话是创建一个task对象,这个task是一个lambda对象,捕获 i 变量传入MyFun

2)创建完任务对象,等待任务队列的锁,获得之后push一个task,然后notify某个线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值