Puede que llegue un poco tarde a esto.
La ausencia de soluciones (en la pregunta que se hizo) se debe principalmente a un problema importante en C ++ (antes de C ++ 0x / 11): C ++ no tiene (tiene) ningún modelo de memoria concurrente.
Ahora, con std :: atomic, puede controlar los problemas de ordenación de la memoria y realizar operaciones adecuadas de comparación e intercambio. Yo mismo escribí una implementación de la cola sin bloqueo de Micheal & Scott (PODC96) usando C ++ 11 y los Hazard Pointers de Micheal (IEEE TPDS 2004) para evitar problemas tempranos libres y ABA. Funciona bien, pero es una implementación rápida y sucia y no estoy satisfecho con el rendimiento real. El código está disponible en bitbucket: LockFreeExperiment
También es posible implementar una cola sin bloqueo sin punteros de peligro usando CAS de palabras dobles (pero las versiones de 64 bits solo serán posibles en x86-64 usando cmpxchg16b), tengo una publicación de blog sobre eso (con código no probado para la cola) aquí : Implementación de comparación e intercambio genérico de palabras dobles para x86 / x86-64 (blog de LSE).
Mi propio punto de referencia me muestra que la cola de doble bloqueo (también en el documento de Micheal & Scott 1996) funciona tan bien como la que no tiene bloqueo (no he alcanzado la suficiente contención para que las estructuras de datos bloqueadas tengan problemas de rendimiento, pero mi banco es demasiado liviano para ahora) y la cola simultánea del TBB de Intel parece incluso mejor (dos veces más rápido) para un número relativamente pequeño (dependiendo del sistema operativo, en FreeBSD 9, el límite más bajo que he encontrado hasta ahora, este número es de 8 subprocesos en un i7 con 4 ht-core, y por lo tanto 8 CPU lógicas) de subprocesos y tienen un comportamiento muy extraño (¡el tiempo de ejecución de mi punto de referencia simple se mueve de segundos a horas!)
Otras limitaciones sobre las colas sin bloqueo siguiendo el estilo STL: tener iteradores en la cola sin bloqueo no tiene sentido.