Circular_buffer z biblioteki boost nie jest wątkowo bezpieczna. Więc zawinąłem boost :: circular_buffer obiekt w klasie, jak pokazano poniżej. Wzajemne wykluczenie między wątkami jest osiągane (jak sądzę) przez użycie zmiennych warunkowych, muteksa i blokady. Czy ten wątek implementacji jest bezpieczny?Bezpieczna implementacja wątku bufora kołowego
#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;
};
Edit Jest to obecnie klasa szablon, który akceptuje obiekt dowolnego typu (nie tylko cv::Mat
obiektu).
Wygląda na to, że lepiej pasowałoby do [CodeReview] (http://codereview.stackexchange.com/). –
Wybacz moje głupie pytanie, ale gdzie jest potrzebny bezpieczny bufor okrągły? We wszystkich punktach, w których kiedykolwiek używałem okrągłego bufora, byłoby złym błędem dostęp do niego z wielu takich wątków. Więc z czystej ciekawości, jaki jest twój przypadek użycia? – LiKao
@LiKao Używam go do pobierania ramek z kamer sieciowych do MATLAB, zobacz mój poprzedni post http://stackoverflow.com/questions/9472880/how-to-implement-a-ccular-buffer-of-cvmat-objects-opencv . Jak podejdziesz do tego? – Alexey