阅读量:0
在C++中,可以使用Task和线程池来实现并发执行任务的功能。Task代表一个可执行的任务,可以是一个函数或者一个类的成员函数。线程池则是一组线程,用来执行任务队列中的任务。
以下是一个简单的示例代码,演示如何在C++中使用Task和线程池:
#include <iostream> #include <vector> #include <thread> #include <queue> #include <functional> #include <mutex> #include <condition_variable> class Task { public: Task(std::function<void()> func) : m_func(func) {} void execute() { m_func(); } private: std::function<void()> m_func; }; class ThreadPool { public: ThreadPool(int numThreads) { for (int i = 0; i < numThreads; ++i) { m_threads.emplace_back([this] { while (true) { Task* task = nullptr; { std::unique_lock<std::mutex> lock(m_mutex); m_condition.wait(lock, [this] { return !m_tasks.empty(); }); task = m_tasks.front(); m_tasks.pop(); } task->execute(); delete task; } }); } } ~ThreadPool() { for (std::thread& thread : m_threads) { thread.join(); } } template<class F, class... Args> void addTask(F&& func, Args&&... args) { auto task = new Task(std::bind(std::forward<F>(func), std::forward<Args>(args)...)); { std::lock_guard<std::mutex> lock(m_mutex); m_tasks.push(task); } m_condition.notify_one(); } private: std::vector<std::thread> m_threads; std::queue<Task*> m_tasks; std::mutex m_mutex; std::condition_variable m_condition; }; void printNumber(int number) { std::cout << "Number: " << number << std::endl; } int main() { ThreadPool threadPool(4); for (int i = 0; i < 10; ++i) { threadPool.addTask(printNumber, i); } std::this_thread::sleep_for(std::chrono::seconds(1)); return 0; }
在这个示例中,我们定义了一个Task类来表示一个任务,然后定义了一个ThreadPool类来管理线程池。在主函数中,我们创建一个ThreadPool对象,并向线程池中提交了10个任务,每个任务打印一个数字。最后,我们让主线程休眠一秒钟,等待所有任务执行完毕。
这样,我们就实现了在C++中使用Task和线程池配合使用的功能。通过线程池可以有效地管理线程的生命周期,并实现多线程并发执行任务的功能。