23.03.22 学习
ChatGPT版代码,CSDN什么垃圾???
在下面的代码中,我们定义了一个 ThreadPool 类表示线程池。在ThreadPool
类的构造函数中,我们创建了指定数量的线程,并将一个 lambda 函数作为线程函数,该 lambda
函数不断从任务队列中取出任务并执行。在任务队列为空时,线程将阻塞并等待条件变量 cv
的通知。如果线程池被停止且任务队列为空,则线程函数退出,线程被回收。
在ThreadPool
类的析构函数中,我们将布尔型变量exit
设为true
,并通知所有线程结束其任务。然后,我们等待所有线程结束并回收其资源。
ThreadPool
类还提供了一个add_task()
成员函数,用于添加一个新的任务到任务队列中。该函数使用了可变参数模板和lambda
函数,将待执行的函数和其参数封装为一个std::function<void()>
对象,并将该对象添加到任务队列中。然后,该函数通知一个等待在条件变量cv
上的线程以便执行新的任务。
在main()
函数中,我们创建了一个ThreadPool
对象,并向其中添加了8
个
#include <iostream>
#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
class ThreadPool {
public:
ThreadPool(size_t num_threads) : exit(false) {
for (size_t i = 0; i < num_threads; ++i) {
threads.emplace_back([this] {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this] { return exit || !mQueue.empty(); });
if (exit && mQueue.empty()) {
return;
}
task = std::move(mQueue.front());
mQueue.pop();
}
task();
}
});
}
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(mtx);
exit = true;
}
cv.notify_all();
for (auto& thread : threads) {
thread.join();
}
}
template<class F>
void add_task(F&& f)
{
{
std::unique_lock<std::mutex> lock(mtx);
tasks.emplace(std::forward<F>(f));
}
cv.notify_one();
}
private:
std::vector<std::thread> threads;
std::queue<std::function<void()>> mQueue;
std::mutex mtx;
std::condition_variable cv;
bool exit;
};
void foo(int i) {
std::cout << "begin" << i << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "end " << i << std::endl;
}
int main() {
ThreadPool pool(4);
for (int i = 0; i < 8; ++i) {
pool.add_task([i] { foo(i); });
}
return 0;
}