2009-10-29 10 views

Respuesta

17

Suponiendo que su CPU tiene una comparación y intercambio de doble puntero (compxchg8b en 486 o superior, compxchg16b en la mayoría de las máquinas amd64 [no presente en algunos de los primeros modelos de Intel]) ... Hay un algoritmo here .

Actualización: No es difícil traducir esto a C++ si no tiene miedo de hacer un poco de trabajo. : P

Este algoritmo supone un "puntero con la etiqueta" estructura que se parece a esto:

// Be aware that copying this structure has to be done atomically... 

template <class T> 
struct pointer 
{ 
    T *ptr; 
    uintptr_t tag; 
}; 

entonces usted quiere envolver las instrucciones lock cmpxchg{8|16}b con algunos asm en línea ...

Tal vez entonces puede escribir el nodo de cola de la siguiente manera:

template <class T> 
struct queue_node 
{ 
    T value; 
    pointer<queue_node<T> > next; 
}; 

el resto es más o menos una transcripción del algoritmo que vincula a ...

+12

@jldupont: -1 es demasiado harash para eso. Asveikau te dio un buen enlace a un algoritmo y solo lleva unos minutos traducirlo a C++. -1 está totalmente fuera de lugar aquí – Rom

+0

... es por eso que no lo he votado a la baja ... solo le he dejado una marca. Si miras mi perfil, verás que soy muy generoso ... no verás muchos votos negativos entregados por mí. – jldupont

+0

@asveikau: buena actualización ... ¡gracias! – jldupont

6

Dado que el estándar actual de C++ ni siquiera reconoce la existencia de subprocesos, ciertamente no hay nada seguro para subprocesos en el STL o en cualquier otra parte de la biblioteca estándar.

+1

OK, entonces: ¿qué tal, fuera de STL? – jldupont

+1

Nada de lo que las garantías estándar serán seguras para hilos de todos modos. Sin embargo, las implementaciones reales pueden proporcionar sus propias garantías. –

1

Los contenedores STL no son seguros para subprocesos, debe implementar su tratamiento para el acceso concurrente.
Existe este proyecto (C++) que tiene como objetivo dar servicio a los accesos concurrentes: CPH STL
y paper about.

1

Respuesta corta - no. STL no se preocupa por la concurrencia (al menos en el nivel de especificación). El estándar actual de C++ no dice nada sobre los hilos.

Puede construir fácilmente una cola de este tipo además de STL y Boost, simplemente ajuste std::queue y boost::mutex en su clase personalizada.

+0

es el impulso normalmente empaquetado en las distribuciones populares, p. Ubuntu, Fedora? – jldupont

+0

Creo que sí, al menos las instalaciones de RHEL vanilla en mi trabajo siempre tienen una versión anterior de Boost en/usr/include que se pone en marcha. –

+0

Tenga en cuenta que la pregunta original era sobre una cola * non-blocking *. Un mutex es una forma de bloqueo, por lo que es poco probable que califique. –

2

Debe implementarlo usted mismo o utilizar una biblioteca que lo implemente. Para hacerlo usted mismo, es posible que desee echar un vistazo a esto:

Implementing a Thread-Safe Queue using Condition Variables

+0

Gracias por el enlace. Parece que agregaría otra dependencia a mi proyecto: impulsar la biblioteca. ¿No? – jldupont

+3

Eso es correcto. De todos modos, eventualmente usarás Boost si eres un desarrollador de C++. La sugerencia de Nikolai N Fetissov sobre boost :: mutex es buena. – KeatsPeeks

+4

Ser un desarrollador de C++ no siempre conduce a Boost. Sé que todos aquí parecen encantarlo, pero muchos proyectos se llevan bien con él (e incluso lo prohíben). Eche un vistazo a cómo Chromium implementa esto. –

0

El actualmente no oficial Boost.Lockfree es algo a tener en cuenta. Yo uso los tipos FIFO y atómico.

1

Puede ser demasiado tarde ahora. Para futuras referencias, esta es una buena implementación de colas sin bloqueo (integradas en seguridad de subprocesos con algunas advertencias).

Multi productor - consumidor Multi

http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++

https://github.com/cameron314/concurrentqueue

solo productor - consumidor individual

http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++

https://github.com/cameron314/readerwriterqueue

Cuestiones relacionadas