Eine begrenzte gleichzeitige Warteschlange mit mehreren Produzenten und mehreren Konsumenten, geschrieben in C++11.
Es ist kampferprobt und wird täglich in der Produktion eingesetzt:
Es wurde in den folgenden Artikeln zitiert:
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);
Konstruiert eine neue MPMCQueue die Elemente vom Typ T mit der Kapazität capacity enthält.
void emplace(Args &&... args);
Stellen Sie ein Element mithilfe der Inplace-Konstruktion in die Warteschlange. Blockiert, wenn die Warteschlange voll ist.
bool try_emplace(Args &&... args);
Versuchen Sie, ein Element mithilfe der Inplace-Konstruktion in die Warteschlange zu stellen. Gibt bei Erfolg true und false zurück, wenn die Warteschlange voll ist.
void push(const T &v);
Stellen Sie ein Element mithilfe der Kopierkonstruktion in die Warteschlange. Blockiert, wenn die Warteschlange voll ist.
template <typename P> void push(P &&v);
Stellen Sie ein Element mithilfe der Bewegungskonstruktion in die Warteschlange. Nimmt nur an der Überladungsauflösung teil, wenn std::is_nothrow_constructible<T, P&&>::value == true . Blockiert, wenn die Warteschlange voll ist.
bool try_push(const T &v);
Versuchen Sie, ein Element mithilfe der Kopierkonstruktion in die Warteschlange einzureihen. Gibt bei Erfolg true und false zurück, wenn die Warteschlange voll ist.
template <typename P> bool try_push(P &&v);
Versuchen Sie, einen Gegenstand mithilfe der Bewegungskonstruktion in die Warteschlange zu stellen. Nimmt nur an der Überladungsauflösung teil, wenn std::is_nothrow_constructible<T, P&&>::value == true . Gibt bei Erfolg true und false zurück, wenn die Warteschlange voll ist.
void pop(T &v);
Entfernen Sie ein Element aus der Warteschlange, indem Sie es kopieren oder in v verschieben. Blockiert, wenn die Warteschlange leer ist.
bool try_pop(T &v);
Versuchen Sie, ein Element aus der Warteschlange zu entfernen, indem Sie es kopieren oder nach v verschieben. Gibt true bei Erfolg und false zurück, wenn die Warteschlange leer ist.
ssize_t size();
Gibt die Anzahl der Elemente in der Warteschlange zurück.
Die Größe kann negativ sein, wenn die Warteschlange leer ist und mindestens ein Leser wartet. Da es sich um eine gleichzeitige Warteschlange handelt, ist die Größe nur eine Best-Effort-Schätzung, bis alle Leser- und Schreibthreads zusammengeführt wurden.
bool empty();
Gibt true zurück, wenn die Warteschlange leer ist.
Da es sich um eine gleichzeitige Warteschlange handelt, ist dies nur eine Schätzung nach bestem Wissen und Gewissen, bis alle Leser- und Schreibthreads verbunden sind.
Alle Vorgänge außer Konstruktion und Zerstörung sind Thread-sicher.

Anfrage:
Aus der Warteschlange entfernen:
Referenzen:
Das Testen von Parallelitätsalgorithmen ist schwierig. Ich verwende zwei Ansätze, um die Implementierung zu testen:
boost::lockfree::queue und anderen static_assert falls verfügbar std::hardware_destructive_interference_size falls verfügbar [[nodiscard]] Attribute hinzu Dieses Projekt wurde von Erik Rigtorp <[email protected]> erstellt.