¿Cuál es la razón por la cual las abstracciones de alto nivel que usan programación sin bloqueo en el fondo no son populares?

StackOverflow https://stackoverflow.com/questions/8400114

Pregunta

Por lo que reuní en la programación sin bloqueo, es increíblemente difícil de hacer bien ... y estoy de acuerdo. Solo pensar en algunos problemas me duele la cabeza. Pero lo que me pregunto es, ¿por qué no hay un uso generalizado de envoltorios de alto nivel (por ejemplo, una cola sin bloqueo y cosas similares)? Por ejemplo, Boost no tiene una biblioteca sin bloqueo, aunque se sugirió una hasta donde yo sé. Quiero decir, supongo que hay muchas aplicaciones en las que no puedes evitar el hecho de que la sección crítica es la gran parte de la carga. Entonces, ¿cuáles son las razones? Lo es...

  1. Patentes: escuché que algunas cosas relacionadas con la programación sin bloqueo están patentadas.
  2. Actuación.
  3. Google y Microsoft tienen bibliotecas internas como esa, pero ninguna de ellas es pública ...
  4. ¿Algo más?

Entonces, mi pregunta es: ¿por qué las abstracciones de alto nivel que usan la programación gratuita de bloqueo en el fondo no son muy populares, mientras que al mismo tiempo la programación multiproceso "regular" es "In"?

Editar: Boost tiene un Librife Lib :)

¿Fue útil?

Solución

Hay pocas personas que estén lo suficientemente familiarizadas con el campo para implementar bibliotecas fáciles de usar sin bloqueo. De esos pocos, incluso menos, publicar trabajos de forma gratuita y de ellos casi ninguno hace el trabajo adicional vital para hacer la biblioteca usable - Por ejemplo, publicar documentos de API completos, etc. Tienden a lanzar un archivo zip con código IN, que es casi inútil. Luego, por supuesto, también debe encontrar una biblioteca escrita en el idioma que desea usar, compila en la plataforma que está utilizando y, finalmente, la palabra de la biblioteca tiene que salir, para que la gente sepa que existe.

Las patentes son un problema, ya que limitan lo que se puede ofrecer. Por ejemplo, no hay una lista no vinculada por un solo enlace sin satisfacción. Todas las cosas de Skip List también son fuertemente patentadas.

Un héroe en este campo es Cliff Click, quien se le ocurrió un hash sin bloqueo, que ha puesto más o menos en el dominio público.

Puedes encontrar mi biblioteca sin bloqueo aquí;

http://www.liblfds.org

Otro es el kit de concurrencia de Samy Bahra;

http://www.concurrencykit.org

Otros consejos

FYI Microsoft .NET Framework ganó algunas clases de bloqueo gratuitas en .NET 4.0. A saber, las clases de contenedores en el espacio de nombres System.Collections.Concurrent, que son:

ConcurrentDictionary
ConcurrentQueue
ConcurrentStack

He investigado su implementación y son relativamente complicados/complejos bajo el capó, por lo tanto, representan una cantidad significativa de esfuerzo en el diseño y las pruebas (los problemas de enhebrado son, por supuesto, notoriamente difíciles de probar a un alto nivel).

Puedes echar un vistazo a libcds Biblioteca C ++. Es una colección de contenedores sin bloqueo (pilas, colas, conjuntos y mapas) y algoritmos de recuperación de memoria seguras.

En mi humilde opinión con respecto a C ++ (no estoy avanzado en otros idiomas). Se acaba de publicar un nuevo estándar C ++ y los desarrolladores de compiladores necesitan un tiempo para implementar sus requisitos. Hoy, todos los compiladores no admiten completamente el modelo de memoria C ++ 11, ya que requiere cambios significativos en las reglas de optimización del compilador. Recientemente, Microsoft anuncia el soporte de las operaciones atómicas que es la base de la programación sin bloqueo en la vista previa del desarrollador VC ++ 11. Es una buena noticia para nosotros. Como sé, GCC lo apoyará en 4.8 (o superior).

El segundo problema son las patentes. Muchos algoritmos interesantes de contenedores sin bloqueo están patentados que es una barrera para incluirlos en las bibliotecas de los proveedores.

Tercero, la parte principal de los contenedores sin bloqueo es la recolección de basura (recuperación de memoria segura). C ++ está libre de cualquier GC (Afortunadamente). Hay algunos algos GC (PeageD Pointer, Pass-the-Buck, Epoch, etc.), pero la mayoría de ellos también están patentados.

Cuarto, no hay suficientes instrumentos para demostrar La corrección de las cercas de memoria se aplica en su implementación sin bloqueo. Ahora conozco solo uno - relaciamiento(http://www.1024cores.net/home/relacy-race-detector).

Creo que después de 2-3 años veremos muchas bibliotecas C ++ multiplataforma de contenedores y algoritmos sin bloqueo de contenedores sin bloqueo. Estas bibliotecas están siendo desarrolladas por proveedores y entusiastas.

Sin embargo, en mi opinión, nuestro futuro es el hardware Memoria de transacción (HTM). Hoy AMD, Sun (Lo siento, Oracle), Intel (?) Están investigando HTM con resultados muy interesantes. Esperemos.

Un problema importante es que a menos que se use un número excesivo de barreras de memoria, es difícil estar seguro de que uno tiene suficiente; Si uno usa un número excesivo de barreras de memoria, es probable que el rendimiento sea inferior a lo que habría obtenido usando cerraduras.

El mayor problema con las cerraduras no es el rendimiento, sino la robustez. Si un subproceso se vuelve rayado mientras contiene un bloqueo, el sistema muere. Por el contrario, si un hilo que accede a una estructura de datos sin bloqueo se vuelve rayado, no afectará el uso de otros hilos del mismo. En algunas situaciones, una estructura de datos sin bloqueo puede ser preferible a una usando cerraduras, Incluso si el rendimiento es inferior, porque uno debe proteger el sistema de ser derribado por un hilo que funcione mal (por ejemplo, incluso si uno estaba preparado para matar un hilo que golpeó una stackoverflowexception sin derribar el proceso, ¿cómo se protegería contra un hilo colocando mucho de rellenar en su pila antes de llamar a un método para acceder a una estructura de datos protegida con bloqueo que el método, de modo que el método protegido por bloqueo alcanza un desbordamiento de la pila?) Si uno usa estructuras de datos sin bloqueo, tales riesgos no son un problema.

Hay al menos un marco de "Lock Free" que es algo popular: Erlang.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top