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.