Une file d'attente simultanée multi-producteurs et multi-consommateurs limitée écrite en C++11.
C'est un produit aguerri et utilisé quotidiennement en production :
Il a été cité par les articles suivants :
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);
Construit une nouvelle MPMCQueue
contenant des éléments de type T
avec capacity
.
void emplace(Args &&... args);
Mettez un élément en file d’attente à l’aide de la construction sur place. Bloque si la file d'attente est pleine.
bool try_emplace(Args &&... args);
Essayez de mettre un élément en file d'attente en utilisant la construction sur place. Renvoie true
en cas de succès et false
si la file d'attente est pleine.
void push(const T &v);
Mettez un élément en file d’attente à l’aide de la construction par copie. Bloque si la file d'attente est pleine.
template <typename P> void push(P &&v);
Mettez un élément en file d’attente en utilisant la construction de déplacement. Participe à la résolution de surcharge uniquement si std::is_nothrow_constructible<T, P&&>::value == true
. Bloque si la file d'attente est pleine.
bool try_push(const T &v);
Essayez de mettre un élément en file d'attente en utilisant la construction par copie. Renvoie true
en cas de succès et false
si la file d'attente est pleine.
template <typename P> bool try_push(P &&v);
Essayez de mettre un élément en file d'attente en utilisant la construction de déplacement. Participe à la résolution de surcharge uniquement si std::is_nothrow_constructible<T, P&&>::value == true
. Renvoie true
en cas de succès et false
si la file d'attente est pleine.
void pop(T &v);
Supprimez un élément de la file d'attente en copiant ou en déplaçant l'élément dans v
. Bloque si la file d'attente est vide.
bool try_pop(T &v);
Essayez de retirer un élément de la file d'attente en copiant ou en déplaçant l'élément dans v
. Renvoie true
en cas de succès et false
si la file d'attente est vide.
ssize_t size();
Renvoie le nombre d'éléments dans la file d'attente.
La taille peut être négative lorsque la file d'attente est vide et qu'il y a au moins un lecteur en attente. Puisqu'il s'agit d'une file d'attente simultanée, la taille n'est qu'une estimation au mieux jusqu'à ce que tous les threads de lecture et d'écriture aient été joints.
bool empty();
Renvoie vrai si la file d'attente est vide.
Puisqu'il s'agit d'une file d'attente simultanée, il ne s'agit que d'une estimation au mieux jusqu'à ce que tous les threads de lecture et d'écriture aient été joints.
Toutes les opérations, à l'exception de la construction et de la destruction, sont thread-safe.
Mise en file d'attente :
Retirer la file d'attente :
Références :
Tester les algorithmes de concurrence est difficile. J'utilise deux approches pour tester l'implémentation :
boost::lockfree::queue
et autres static_assert
si disponible std::hardware_destructive_interference_size
si disponible [[nodiscard]]
Ce projet a été créé par Erik Rigtorp <[email protected]>.