多线程 中lock_guard<mutex>lock 图像指针队列 demo
时间: 2024-10-01 11:04:06 浏览: 34
在多线程编程中,`std::lock_guard<std::mutex>` 是一种智能锁,它是一种简化版的互斥锁管理方式。当你需要保护一段代码不被并发访问时,可以使用 `lock_guard`,它会在构造时自动获取锁,在析构时自动释放锁,无需手动调用 lock 和 unlock 函数,这有助于避免忘记解锁导致的资源泄露问题。
图像指针队列(Image Pointer Queue,IPQ)是一个数据结构,通常用于存储图片指针,并按照某种策略进行组织,如先进先出(FIFO)、最近最少使用(LRU)等。在多线程环境中,可能会有一个单独的线程负责从 IPQ 中取出图片指针供其他线程使用,同时使用 `lock_guard` 确保对队列的操作是线程安全的。
下面是一个简单的 C++ 示例,展示如何使用 `std::lock_guard` 保护图像指针队列:
```cpp
#include <queue>
#include <mutex>
#include <condition_variable>
class Image {
public:
// 图片数据...
};
class ImageQueue {
private:
std::queue<Image*> images;
mutable std::mutex queue_mutex;
std::condition_variable image_available;
public:
void push(Image* img) {
std::lock_guard<std::mutex> lock(queue_mutex);
images.push(img);
image_available.notify_one(); // 当有新元素入队时唤醒等待者
}
Image* pop() {
std::unique_lock<std::mutex> lock(queue_mutex);
image_available.wait(lock, [] { return !images.empty(); }); // 阻塞直到队列非空
if (images.empty()) {
throw std::runtime_error("Queue is empty");
}
Image* img = images.front();
images.pop();
return img;
}
};
int main() {
ImageQueue queue;
// 创建和添加图片实例
Image img1, img2;
queue.push(&img1); // 使用lock_guard确保操作线程安全
// 两个线程分别从队列取图
std::thread thread1([](ImageQueue& q) {
while (true) {
try {
Image* img = q.pop();
// 处理图片...
} catch (const std::exception& e) {
break; // 如果队列为空则退出循环
}
}
}, std::ref(queue));
std::thread thread2([](ImageQueue& q) {
while (true) {
q.push(&img2); // 同样使用lock_guard
// 模拟处理延迟...
}
}, std::ref(queue));
thread1.join();
thread2.join();
return 0;
}
```
在这个例子中,`push` 和 `pop` 方法都使用了 `lock_guard` 来保证队列操作的原子性和互斥性。当线程1和线程2同时试图访问队列时,只有一个线程会被允许执行相应操作,另一个线程将阻塞直到前一个完成。
阅读全文