c++ 图像线程池
时间: 2023-06-28 20:12:47 浏览: 139
图像线程池是一种用于并发处理图像任务的技术。它通常包括一个任务队列和一组线程,每个线程都可以从任务队列中获取一个任务并执行它。当有新任务加入时,它会被添加到任务队列中。而线程则会不断地从队列中取出任务并执行,直到队列为空。这种设计可以有效地利用多核 CPU 的性能,提高图像处理的效率。
以下是一个使用 C++ 实现的图像线程池示例:
```c++
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <chrono>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Image {
public:
Image(Mat img) : data(img) {}
Mat data;
};
class TaskQueue {
public:
void push(Image img) {
unique_lock<mutex> lock(m_mutex);
m_queue.push(img);
m_cond.notify_one();
}
Image pop() {
unique_lock<mutex> lock(m_mutex);
while (m_queue.empty()) {
m_cond.wait(lock);
}
auto img = m_queue.front();
m_queue.pop();
return img;
}
private:
queue<Image> m_queue;
mutex m_mutex;
condition_variable m_cond;
};
class ThreadPool {
public:
ThreadPool(int num_threads) {
for (int i = 0; i < num_threads; ++i) {
m_threads.emplace_back([this]() {
while (true) {
auto task = m_queue.pop();
if (!task.data.empty()) {
// process image
cout << "Thread " << this_thread::get_id() << " processing image" << endl;
waitKey(1000);
} else {
break;
}
}
});
}
}
~ThreadPool() {
for (auto& t : m_threads) {
m_queue.push(Image(Mat())); // add empty task to signal thread to exit
t.join();
}
}
void add_task(Image img) {
m_queue.push(img);
}
private:
TaskQueue m_queue;
vector<thread> m_threads;
};
int main() {
vector<Image> images;
images.emplace_back(Image(imread("image1.png")));
images.emplace_back(Image(imread("image2.png")));
images.emplace_back(Image(imread("image3.png")));
ThreadPool pool(4);
for (auto& img : images) {
pool.add_task(img);
}
// wait for tasks to complete
this_thread::sleep_for(chrono::seconds(5));
}
```
在上述示例中,我们定义了一个 `Image` 类来表示图像,一个 `TaskQueue` 类来表示任务队列,以及一个 `ThreadPool` 类来表示线程池。其中, `ThreadPool` 构造函数会创建指定数量的线程,并且每个线程会不断地从任务队列中取出任务并执行。 `ThreadPool` 还提供了一个 `add_task` 方法,在其中我们可以将需要处理的图像加入任务队列中。最后,我们在主函数中创建了一些示例图像,并将它们添加到线程池中执行。
当我们运行上述代码时,我们可以看到每个线程交替地处理图像,直到所有任务都被完成。
阅读全文