【发布时间】:2012-04-02 08:53:13
【问题描述】:
来自 boost 库的 Circular_buffer 不是线程安全的。所以我将 boost::circular_buffer 对象包装在一个类中,如下所示。通过使用条件变量、互斥锁和锁获取/释放来实现线程之间的互斥(我认为)。这个实现线程安全吗?
#include <boost/thread/condition.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/circular_buffer.hpp>
// Thread safe circular buffer
template <typename T>
class circ_buffer : private boost::noncopyable
{
public:
typedef boost::mutex::scoped_lock lock;
circ_buffer() {}
circ_buffer(int n) {cb.set_capacity(n);}
void send (T imdata) {
lock lk(monitor);
cb.push_back(imdata);
buffer_not_empty.notify_one();
}
T receive() {
lock lk(monitor);
while (cb.empty())
buffer_not_empty.wait(lk);
T imdata = cb.front();
cb.pop_front();
return imdata;
}
void clear() {
lock lk(monitor);
cb.clear();
}
int size() {
lock lk(monitor);
return cb.size();
}
void set_capacity(int capacity) {
lock lk(monitor);
cb.set_capacity(capacity);
}
private:
boost::condition buffer_not_empty;
boost::mutex monitor;
boost::circular_buffer<T> cb;
};
编辑 现在这是一个模板类,它接受任何类型的对象(不仅仅是cv::Mat 对象)。
【问题讨论】:
-
这看起来更适合CodeReview。
-
请原谅我的愚蠢问题,但是哪里需要线程安全的循环缓冲区?在我曾经使用过循环缓冲区的所有地方,像这样从多个线程访问它是一个严重的错误。所以只是出于好奇,你的用例是什么?
-
@LiKao 我用它来从网络摄像机抓取帧到 MATLAB,见我之前的帖子stackoverflow.com/questions/9472880/…。你会如何处理这个问题?
-
您的 Mat 对象有多大/有多贵?
-
@LiKao : 你会用这样的东西来实现一个生产者-消费者队列 (en.wikipedia.org/wiki/Producer-consumer_problem)。这样的队列可以在多线程管道的各个阶段之间使用。
标签: c++ multithreading boost opencv