循环体中将任务加入到线程池队列踩坑

循环体中将任务加入到线程池队列踩坑

问题描述

new了一个线程池并设置了线程大小后,假设线程大小为3,任务数量远远大于线程设置大小。那么任务就会自动加入到队列中。运行后发现,除了前面的3个任务可以正常执行,其它执行的任务都为同一个任务。

原因

可能是存放在线程池队列中的对象都是同一个对象

相关代码

对象queryVo必须放在循环体内-------原因:如果放在循环体外,当线程池设置的大小没有当前任务多时,任务会存放在线程池的队列中,而这时候,存放在线程池队列中的对象都是同一个对象。这样就无法根据不同的参数执行不同的任务了。
另外,最好后面可以显示关闭线程池,多层嵌套循环也应该注意该问题
在这里插入图片描述

好的,我可以回答这个问题。以下是一个简单的 Qt 5.15.2 线程池任务队列的实现: 首先,我们需要定义一个任务类,它包含一个执行任务的函数: ``` class Task { public: virtual void run() = 0; }; ``` 然后,我们定义一个任务队列类,它包含一个任务队列和一个线程池: ``` class TaskQueue { public: TaskQueue(int threadCount) { for (int i = 0; i < threadCount; ++i) { QThread* thread = new QThread(this); thread->start(); m_threads.append(thread); } } ~TaskQueue() { for (int i = 0; i < m_threads.size(); ++i) { m_threads[i]->quit(); m_threads[i]->wait(); } } void addTask(Task* task) { m_mutex.lock(); m_tasks.append(task); m_mutex.unlock(); m_semaphore.release(); } private: QList<QThread*> m_threads; QList<Task*> m_tasks; QMutex m_mutex; QSemaphore m_semaphore; }; ``` 在任务队列,我们使用一个信号量来控制线程池的线程数量。当有新任务添加到任务队列时,我们会释放一个信号量,让一个线程来执行任务。 最后,我们定义一个任务执行器类,它会从任务队列取出任务执行: ``` class TaskExecutor : public QObject { Q_OBJECT public: TaskExecutor(TaskQueue* taskQueue) : m_taskQueue(taskQueue) { connect(taskQueue, &TaskQueue::taskAdded, this, &TaskExecutor::onTaskAdded); } private slots: void onTaskAdded() { while (true) { m_taskQueue->m_semaphore.acquire(); m_taskQueue->m_mutex.lock(); if (m_taskQueue->m_tasks.isEmpty()) { m_taskQueue->m_mutex.unlock(); continue; } Task* task = m_taskQueue->m_tasks.takeFirst(); m_taskQueue->m_mutex.unlock(); task->run(); delete task; } } private: TaskQueue* m_taskQueue; }; ``` 在任务执行器类,我们使用一个死循环来不断地从任务队列取出任务执行。 最后,我们可以使用以下代码来创建一个线程池任务队列: ``` TaskQueue taskQueue(4); TaskExecutor taskExecutor(&taskQueue); for (int i = 0; i < 10; ++i) { taskQueue.addTask(new MyTask(i)); } ``` 其,`MyTask` 是我们自己定义的任务类,它继承自 `Task` 并实现了 `run` 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值