¿Hay alguna C aplicación ++ (códigos fuente) de "optmistic approach to lock-free FIFO queues" algorithm?¿Existe una implementación de cola FIFO optimista sin bloqueo?
Respuesta
Herb Sutter cubre sólo una cola, como parte de su columna Concurency eficaz en el Dr. Dobbs Journal.
Si' Estamos buscando una buena implementación de cola libre de bloqueo tanto Microsoft Visual Studio 2010 & Los bloques de construcción de subprocesos de Intel contienen una buena cola LF que es similar al papel.
Quiero concluir la respuesta dada por greyfade, que se basa en http://www.drdobbs.com/high-performance-computing/212201163 (la última parte del artículo), el código optimizado sería (con algunas modificaciones para adaptarse a mi nombramiento y convenciones de codificación) : `
template <typename T> class LFQueue {
private:
struct LFQNode {
LFQNode(T* val) : value(val), next(nullptr) { }
T* value;
AtomicPtr<LFQNode> next;
char pad[CACHE_LINE_SIZE - sizeof(T*) - sizeof(AtomicPtr<LFQNode>)];
};
char pad0[CACHE_LINE_SIZE];
LFQNode* first; // for one consumer at a time
char pad1[CACHE_LINE_SIZE - sizeof(LFQNode*)];
InterlockedFlag consumerLock; // shared among consumers
char pad2[CACHE_LINE_SIZE - sizeof(InterlockedFlag)];
LFQNode* last; // for one producer at a time
char pad3[CACHE_LINE_SIZE - sizeof(LFQNode*)];
InterlockedFlag producerLock; // shared among producers
char pad4[CACHE_LINE_SIZE - sizeof(InterlockedFlag)];
public:
LFQueue() {
first = last = new LFQNode(nullptr); // no more divider
producerLock = consumerLock = false;
}
~LFQueue() {
while(first != nullptr) {
LFQNode* tmp = first;
first = tmp->next;
delete tmp;
}
}
bool pop(T& result) {
while(consumerLock.set(true))
{ } // acquire exclusivity
if(first->next != nullptr) { // if queue is nonempty
LFQNode* oldFirst = first;
first = first->next;
T* value = first->value; // take it out
first->value = nullptr; // of the Node
consumerLock = false; // release exclusivity
result = *value; // now copy it back
delete value; // and clean up
delete oldFirst; // both allocations
return true; // and report success
}
consumerLock = false; // release exclusivity
return false; // queue was empty
}
bool push(const T& t) {
LFQNode* tmp = new LFQNode(t); // do work off to the side
while(producerLock.set(true))
{ } // acquire exclusivity
last->next = tmp; // A: publish the new item
last = tmp; // B: not "last->next"
producerLock = false; // release exclusivity
return true;
}
};
`
otra pregunta es ¿cómo se define CACHE_LINE_SIZE? es diferente en CPU alguna vez, ¿verdad?
Un buen número para elegir sería ser '64' bytes, creo. Pero es probable que desee equilibrarlo con el tamaño, por lo que le sugiero que mire las CPU de destino y elija un tamaño que se ajuste a las más comunes a las que espera apuntar. – greyfade
Solo una nota rápida: este no es un foro, por lo que no se puede suponer que las personas "naveguen por el hilo". Si desea hacer otra pregunta, mejor use el campo "Preguntar" en lugar de "Su respuesta". –
De hecho, estoy volviendo a responder la pregunta, pero me equivoqué al preguntar en el campo de respuesta, debería agregar un nuevo comentario debajo de mi propia respuesta. Lo siento por eso. – uray
Aquí está mi implementación de un FIFO sin bloqueo.
Asegúrese de que cada elemento de T sea un múltiplo de 64 bytes (el tamaño de la línea de caché en las CPU Intel) para evitar el uso compartido falso.
Este código se compila con gcc/mingw y debe compilarse con clang. Está optimizado para 64 bits, por lo que para que se ejecute en 32 bits necesitaría algunas refactorizaciones.
https://github.com/vovoid/vsxu/blob/master/engine/include/vsx_fifo.h
vsx_fifo<my_struct, 512> my_fifo;
remitente:
my_struct my_struct_inst;
... fill it out ...
while (!my_fifo.produce(my_struct_inst)) {}
receptor:
my_struct my_struct_recv;
while(my_fifo.consume(my_struct_recv))
{
...do stuff...
}
Como veo, es seguro para subprocesos pero no reentrante. – peterh
- 1. Bloqueo optimista y org.hibernate.StaleObjectStateException:
- 2. Crear una cola FIFO en C
- 3. pesimista frente concurrencia optimista (Bloqueo contra Comentarios)
- 4. Bloqueo optimista en Hibernate de forma predeterminada
- 5. NSOperationQueue cola FIFO en serie
- 6. ¿Hay una implementación de vector sin bloqueo?
- 7. Implementación de una cola basada en archivos
- 8. Implementación de cola de bloqueo de subprocesos en .NET
- 9. ¿Es esto (bloqueo) la implementación de cola Thread-Safe?
- 10. Cómo garantizar la cola azul FIFO
- 11. Cohete múltiple de un solo lector cola única de fifo
- 12. jQuery llamadas sincrónicas ajax sin bloqueo
- 13. Bloqueo sin bloqueo
- 14. cola segura para hilos sin bloqueo en C++?
- 15. Implementación de una cola simple usando matrices
- 16. Cola concurrente y de bloqueo en Java
- 17. ¿Existe una cola sin bloqueos "múltiples productores, consumidor único" para Delphi?
- 18. Implementación de cola en C#
- 19. Implementaciones basadas en FIFO Queue?
- 20. ¿Existe una implementación de handlebars.js en Java?
- 21. ¿Existe una cola ordenada en .NET?
- 22. teclado cola de bloqueo interrumpible en Python
- 23. Prevenir FIFO de cierre/reutilización cerrado FIFO
- 24. Ejecute pdb sin stdin/stdout usando FIFO
- 25. Sin bloqueo pthread_join
- 26. ¿Existe una implementación eficiente de tetration?
- 27. ¿Existe una implementación .NET de HtmlPurifier (php)
- 28. ¿Cuál es el término correcto para una cola FIFO de tamaño fijo?
- 29. Implementación de cola de prioridad de Brodal
- 30. ¿Cómo utilizar la propiedad de versión de bloqueo optimista de Hibernate en la interfaz?
que es la teoría, lo que I'am pidiendo es la implementación. ¿Hay algún código fuente o biblioteca que implemente esos algoritmos? – uray
@uray: Sí. En el artículo. – greyfade
¿dónde? no veo ningún archivo de código fuente allí. – uray