Una cola simultánea multiproductor y consumidor limitada escrita en C++11.
Está endurecido en batalla y se usa diariamente en producción:
Ha sido citado por los siguientes artículos:
MPMCQueue< int > q ( 10 );
auto t1 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t1 " << v << " n " ;
});
auto t2 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t2 " << v << " n " ;
});
q.push( 1 );
q.push( 2 );
t1.join();
t2.join();
MPMCQueue<T>(size_t capacity);
Construye una nueva MPMCQueue
que contiene elementos de tipo T
con capacity
capacidad.
void emplace(Args &&... args);
Poner en cola un elemento mediante construcción in situ. Se bloquea si la cola está llena.
bool try_emplace(Args &&... args);
Intente poner en cola un elemento mediante construcción in situ. Devuelve true
en caso de éxito y false
si la cola está llena.
void push(const T &v);
Poner en cola un elemento mediante construcción de copia. Se bloquea si la cola está llena.
template <typename P> void push(P &&v);
Poner en cola un elemento mediante construcción de movimiento. Participa en la resolución de sobrecarga solo si std::is_nothrow_constructible<T, P&&>::value == true
. Se bloquea si la cola está llena.
bool try_push(const T &v);
Intente poner en cola un elemento mediante la construcción de copias. Devuelve true
en caso de éxito y false
si la cola está llena.
template <typename P> bool try_push(P &&v);
Intente poner en cola un elemento mediante la construcción de movimientos. Participa en la resolución de sobrecarga solo si std::is_nothrow_constructible<T, P&&>::value == true
. Devuelve true
en caso de éxito y false
si la cola está llena.
void pop(T &v);
Retire un elemento de la cola copiándolo o moviéndolo a v
. Se bloquea si la cola está vacía.
bool try_pop(T &v);
Intente quitar un elemento de la cola copiándolo o moviéndolo a v
. Devuelve true
en caso de éxito y false
si la cola está vacía.
ssize_t size();
Devuelve el número de elementos de la cola.
El tamaño puede ser negativo cuando la cola está vacía y hay al menos un lector esperando. Dado que se trata de una cola concurrente, el tamaño es solo una estimación del mejor esfuerzo hasta que se hayan unido todos los hilos de lectores y escritores.
bool empty();
Devuelve verdadero si la cola está vacía.
Dado que se trata de una cola concurrente, esta es solo una estimación del mejor esfuerzo hasta que se hayan unido todos los hilos de lectores y escritores.
Todas las operaciones, excepto la construcción y destrucción, son seguras para subprocesos.
Continúe:
Quitar de la cola:
Referencias:
Probar algoritmos de concurrencia es difícil. Estoy usando dos enfoques para probar la implementación:
boost::lockfree::queue
y otros static_assert
si está disponible std::hardware_destructive_interference_size
si está disponible [[nodiscard]]
Este proyecto fue creado por Erik Rigtorp <[email protected]>.