Circular_buffer from boost library no es seguro para subprocesos. Así que envolví el objeto boost :: circular_buffer en una clase como se muestra a continuación. La exclusión mutua entre los hilos se logra (creo) mediante el uso de variables condicionales, un mutex y una adquisición/liberación de bloqueos. ¿Este hilo de implementación es seguro?Implementación segura de subprocesos de la memoria intermedia circular
#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;
};
Editar Esto es ahora una clase de plantilla, que acepta un objeto de cualquier tipo (no sólo cv::Mat
objeto).
Parece que se ajustaría mejor en [CodeReview] (http://codereview.stackexchange.com/). –
Perdona mi pregunta tonta, pero ¿dónde se necesita un búfer circular seguro de hilo? En todos los puntos en los que he usado un búfer circular, habría sido un grave error acceder a él desde varios hilos como este. Entonces, solo por curiosidad, ¿cuál es tu caso de uso para esto? – LiKao
@LiKao Lo uso para tomar fotogramas de cámaras de red en MATLAB, ver mi publicación anterior http://stackoverflow.com/questions/9472880/how-to-implement-a-circular-buffer-of-cvmat-objects-opencv . ¿Cómo te acercarías a esto? – Alexey