Ограниченная одновременная очередь с несколькими производителями и множеством потребителей, написанная на C++11.
Он закален в боях и ежедневно используется в производстве:
Его цитируют следующие статьи:
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);
Создает новую MPMCQueue
содержащую элементы типа T
с capacity
.
void emplace(Args &&... args);
Поставьте элемент в очередь, используя конструкцию на месте. Блокируется, если очередь заполнена.
bool try_emplace(Args &&... args);
Попробуйте поставить элемент в очередь, используя конструкцию на месте. Возвращает true
в случае успеха и false
если очередь заполнена.
void push(const T &v);
Поставьте элемент в очередь, используя конструкцию копирования. Блокируется, если очередь заполнена.
template <typename P> void push(P &&v);
Поставьте элемент в очередь, используя конструкцию перемещения. Участвует в разрешении перегрузки, только если std::is_nothrow_constructible<T, P&&>::value == true
. Блокируется, если очередь заполнена.
bool try_push(const T &v);
Попробуйте поставить элемент в очередь, используя конструкцию копирования. Возвращает true
в случае успеха и false
если очередь заполнена.
template <typename P> bool try_push(P &&v);
Попробуйте поставить элемент в очередь, используя конструкцию перемещения. Участвует в разрешении перегрузки, только если std::is_nothrow_constructible<T, P&&>::value == true
. Возвращает true
в случае успеха и false
если очередь заполнена.
void pop(T &v);
Удалите элемент из очереди, скопировав или переместив его в v
. Блокируется, если очередь пуста.
bool try_pop(T &v);
Попробуйте исключить элемент из очереди, скопировав или переместив его в v
. Возвращайте true
в случае успеха и false
если очередь пуста.
ssize_t size();
Возвращает количество элементов в очереди.
Размер может быть отрицательным, если очередь пуста и ожидает хотя бы один читатель. Поскольку это параллельная очередь, ее размер является лишь приблизительным, пока все потоки чтения и записи не будут объединены.
bool empty();
Возвращает true, если очередь пуста.
Поскольку это параллельная очередь, это всего лишь предположение, пока все потоки чтения и записи не будут объединены.
Все операции, кроме создания и разрушения, являются потокобезопасными.
В очереди:
Удаление из очереди:
Ссылки:
Тестировать алгоритмы параллелизма сложно. Я использую два подхода для тестирования реализации:
boost::lockfree::queue
и другими. static_assert
если они доступны. std::hardware_destructive_interference_size
если доступно. [[nodiscard]]
Этот проект был создан Эриком Ригторпом <[email protected]>.