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

Foi útil?

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 ++

https://github.com/cameron314/readerwriterqueue

O momento não oficial Boost.Lockfree é algo a considerar. Eu uso tanto o FIFO e os tipos atômicos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top