sem bloqueio fila de thread-safe em C ++?
-
10-07-2019 - |
Pergunta
Existe um, bloqueando não-classe thread-safe queue no C ++?
Provavelmente uma pergunta básica, mas eu não tenho feito C ++ por um longo tempo ...
EDIT:. exigência STL removido
Solução
Assumindo que o seu CPU tem um duplo-ponteiro ampla comparar-and-swap (compxchg8b em 486 ou superior, compxchg16b na maioria das máquinas amd64 [não está presente em alguns modelos iniciais da Intel]) ... Existe um algoritmo aqui .
Update: Não é difícil de traduzir isso para C ++, se você não tem medo de fazer um pouco de trabalho. : P
Este algoritmo assume um "ponteiro com tag" estrutura que tem esta aparência:
// Be aware that copying this structure has to be done atomically...
template <class T>
struct pointer
{
T *ptr;
uintptr_t tag;
};
Então você quer envolver o lock cmpxchg{8|16}b
instruções com alguma linha asm ...
Talvez então você pode escrever o nó fila como este:
template <class T>
struct queue_node
{
T value;
pointer<queue_node<T> > next;
};
O resto é mais ou menos uma transcrição do algoritmo I ligado a ...
Outras dicas
Uma vez que a corrente de C ++ padrão nem sequer reconhecer a existência de tópicos, há certamente nada thread-safe na STL ou qualquer outra parte da biblioteca padrão.
Esta parece ter sido um tema popular no ano passado do Dr. Dobb:
Você precisa implementá-lo você mesmo ou usar uma biblioteca de implementá-lo. Para fazê-lo sozinho, você pode querer ter um olhar para este:
Implementação de um Tópico -Safe fila usando variáveis ??de condição
resposta curta - não. STL não preocupar-se com a concorrência (pelo menos no nível de especificação.) Padrão atual C ++ não diz nada sobre tópicos.
Você pode facilmente construir uma tal fila no topo de STL e impulsionar embora -. Apenas std::queue
envoltório e boost::mutex
em sua classe personalizada
contêineres STL não são thread-safe, você deve implementar o seu tratamento para acesso simultâneo.
Há este projeto (C ++) que visa servir acessos simultâneos: CPH STL
e papel sobre .
Pode ser tarde demais agora. Para referência futura, esta é uma boa implementação de filas de livre-lock (construído em segurança de uma discussão com algumas ressalvas).
Multi produtor - multi consumidor
http: // moodycamel. com / blog / 2014 / a-fast-general-purpose-lock-free-queue-de-c ++
https://github.com/cameron314/concurrentqueue
Único produtor - consumidor Single
http://moodycamel.com/blog/ 2013 / a-fast-lock-free-queue-de-c ++
O momento não oficial Boost.Lockfree é algo a considerar. Eu uso tanto o FIFO e os tipos atômicos.