用c++代码来实现一个线程池
时间: 2024-03-13 14:10:06 浏览: 65
C++实现的线程池
当然,我可以为您提供一个简单的C++代码示例来实现一个线程池。以下是一个基本的线程池实现:
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
class ThreadPool {
public:
ThreadPool(size_t numThreads) : stop(false) {
for (size_t i = 0; i < numThreads; ++i) {
threads.emplace_back([this] {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(this->queueMutex);
this->condition.wait(lock, [this] {
return this->stop || !this->tasks.empty();
});
if (this->stop && this->tasks.empty()) {
return;
}
task = std::move(this->tasks.front());
this->tasks.pop();
}
task();
}
});
}
}
template<class F, class... Args>
void enqueue(F&& f, Args&&... args) {
{
std::unique_lock<std::mutex> lock(queueMutex);
tasks.emplace([=] {
std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
});
}
condition.notify_one();
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(queueMutex);
stop = true;
}
condition.notify_all();
for (std::thread& thread : threads) {
thread.join();
}
}
private:
std::vector<std::thread> threads;
std::queue<std::function<void()>> tasks;
std::mutex queueMutex;
std::condition_variable condition;
bool stop;
};
// Example usage
void taskFunction(int id) {
std::cout << "Executing task " << id << std::endl;
// Simulate some work
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main() {
ThreadPool threadPool(4);
// Enqueue tasks
for (int i = 0; i < 10; ++i) {
threadPool.enqueue(taskFunction, i);
}
// Wait for tasks to complete
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
```
在上面的示例中,我们定义了一个ThreadPool类来实现线程池。在构造函数中,我们创建了指定数量的线程,并让它们在一个循环中等待任务的到来。每个线程会从任务队列中取出一个任务并执行。enqueue()函数用于将任务加入到任务队列中,并通过condition_variable来通知等待线程有新的任务可执行。在析构函数中,我们首先设置stop标志为true,然后通过condition_variable来通知所有等待的线程停止执行,并等待所有线程结束。
在示例的main函数中,我们创建了一个ThreadPool对象并通过enqueue()函数将一些任务加入到线程池中。每个任务都是一个简单的函数taskFunction,它接受一个参数id并在执行时输出一些信息并模拟一些工作。最后,我们通过调用std::this_thread::sleep_for()函数等待一些时间,以确保所有任务都完成。
请注意,这只是一个简单的线程池示例。在实际应用中,您可能还需要考虑任务优先级、异常处理、任务队列的大小限制等其他因素。
阅读全文