Uma fila simultânea limitada de vários produtores e vários consumidores escrita em C++ 11.
É uma batalha endurecida e usada diariamente na produção:
Foi citado pelos seguintes artigos:
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);
Constrói um novo MPMCQueue
contendo itens do tipo T
com capacity
.
void emplace(Args &&... args);
Enfileirar um item usando construção local. Bloqueia se a fila estiver cheia.
bool try_emplace(Args &&... args);
Tente enfileirar um item usando construção local. Retorna true
em caso de sucesso e false
se a fila estiver cheia.
void push(const T &v);
Enfileirar um item usando construção de cópia. Bloqueia se a fila estiver cheia.
template <typename P> void push(P &&v);
Enfileirar um item usando a construção de movimentação. Participa da resolução de sobrecarga somente se std::is_nothrow_constructible<T, P&&>::value == true
. Bloqueia se a fila estiver cheia.
bool try_push(const T &v);
Tente enfileirar um item usando construção de cópia. Retorna true
em caso de sucesso e false
se a fila estiver cheia.
template <typename P> bool try_push(P &&v);
Tente enfileirar um item usando a construção de movimentos. Participa da resolução de sobrecarga somente se std::is_nothrow_constructible<T, P&&>::value == true
. Retorna true
em caso de sucesso e false
se a fila estiver cheia.
void pop(T &v);
Retire um item da fila copiando ou movendo o item para v
. Bloqueia se a fila estiver vazia.
bool try_pop(T &v);
Tente desenfileirar um item copiando ou movendo o item para v
. Retorna true
em caso de sucesso e false
se a fila estiver vazia.
ssize_t size();
Retorna o número de elementos na fila.
O tamanho pode ser negativo quando a fila está vazia e há pelo menos um leitor aguardando. Como esta é uma fila simultânea, o tamanho é apenas uma estimativa de melhor esforço até que todos os threads de leitura e gravação tenham sido unidos.
bool empty();
Retorna verdadeiro se a fila estiver vazia.
Como esta é uma fila simultânea, este é apenas um palpite de melhor esforço até que todos os threads de leitura e gravação tenham sido unidos.
Todas as operações, exceto construção e destruição, são seguras para threads.
Pesquisar:
Desenfileirar:
Referências:
Testar algoritmos de simultaneidade é difícil. Estou usando duas abordagens para testar a implementação:
boost::lockfree::queue
e outros static_assert
se disponível std::hardware_destructive_interference_size
se disponível [[nodiscard]]
Este projeto foi criado por Erik Rigtorp <[email protected]>.