ブーストライブラリの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](http://codereview.stackexchange.com/)でうまくいくようです。 –
私の愚かな疑問を許しますが、スレッド安全循環バッファが必要なのはどこですか?循環型バッファを使用していた時点では、このように複数のスレッドからアクセスするのは間違いでした。好奇心のためだけに、このユースケースは何ですか? – LiKao
@LiKao私はネットワークカメラのフレームをMATLABに取り込むために使っています。以前の投稿を見てください。http://stackoverflow.com/questions/9472880/how-to-implement-a-circular-buffer-of-cvmat-objects-opencv 。どのようにこれにアプローチしますか? – Alexey