2009-11-08 12 views
6

Estoy buscando alguna biblioteca C que incluya mapas hash de estilo STM (memoria transaccional de software), pero hasta ahora no he tenido suerte. Sería genial si estuviera basado en glib/gobject, pero no es tan crucial. Tampoco necesita transacciones adecuadas sobre muchos objetos: el soporte de hash inmutable es todo lo que realmente necesito.Biblioteca hash STM para C (glib?)

Debe tener: lectura de instantánea inmutable, escritura sin bloqueos con reintentos automáticos.

+0

¿Quiso decir STL en lugar de STM? –

+1

Creo que se refiere a STM - Software Transactional Memory - ya que está buscando cosas como instantáneas y reintentos automáticos: http://en.wikipedia.org/wiki/Software_transactional_memory Pero probablemente debería dejar eso en claro, ya que STM no es una área muy conocida. –

+0

Corregido la descripción. Michael tiene razón. – viraptor

Respuesta

4

Wikipedia tiene una lista de varios STM implementations.

+0

Miré a través de ellos. Pero son de muy bajo nivel. El mejor para la integración es probablemente stmmap: http://github.com/skaphan/stmmap. Pero estoy buscando algo que ya incluya la implementación de hashmap. Lamentablemente, no puedo estar seguro de qué es seguro para usar una biblioteca de estructura de datos aleatoria en la parte superior de la biblioteca stm ... Preferiría algo que funcione en un nivel superior. (solución de estructura de datos + stm preparada) – viraptor

3

Bueno, creo (y hay varios estudios) que el STM actual no es más rápido que el código sin bloque y basado en mutex. Es obvio: STM requiere verificación de conflictos de datos en línea. Sin embargo, tal comprobación de conflictos en software puro requiere mucho tiempo de gastos generales. Actualmente, solo el ROCK processor de Sun admite una forma limitada de STM (Best-effort HTM con STM) por hardware. Actualmente, ninguna CPU x86 admite TM en el hardware. En resumen, STM es simplemente lento.

En mi opinión, será mejor que utilice una tabla hash concurrente. Por ejemplo, puede encontrar concurrent_hash_map en Intel TBB. Aquí está el enlace de TBB Manual. Oh, pero es C++, no C. Pero, sí creo que puedes (aunque podría requerir mucho trabajo) traducir esa tabla hash basada en C++ al código C. Intel TBB es de código abierto.

Además, creo que estructuras de datos tan concurrentes (generalmente implementadas como libres de bloqueos) no siempre son útiles. En algunos patrones de carga de trabajo, el uso de tales estructuras de datos no es bueno. Para estar seguro, le recomiendo que escriba una pequeña micro-referencia para dos versiones de tablas hash: (1) sin bloqueo y (2) basado en bloqueo. Además, tenga en cuenta que los patrones de carga de trabajo para dicho micro-benchmark deberían ser cercanos a uno real. Un ejemplo se puede encontrar en here.

+1

Sé que a veces son más lentos. Pero a veces también son más fáciles en una solución específica. Tengo un gran hash que a menudo se lee, rara vez se escribe en él. También escribe lleva mucho tiempo y necesita una búsqueda primero. Con un grupo de lectores y 1 escritor, es un caso perfecto para STM. Además, NO NECESITA una verificación de conflictos en línea. Puede implementar muchas soluciones de estilo STM de forma que el lector NUNCA espere y NUNCA bloquee (y el escritor nunca espere, aunque podría tener que volver a intentarlo) utilizando solo el CMPXCHG estándar. Para mí, esa es una sincronización cada 30 segundos -vs- agarrando el bloqueo de lectura cada 10 ms. – viraptor

+0

Entiendo tu problema. Es mejor usar una estructura de datos "libre de bloqueos" en lugar del estilo STM. STM siempre significa verificación de conflictos. ¿Qué hay de RCU? http://en.wikipedia.org/wiki/Read-copy-update – minjang

+0

PD. Sé que concurrent_hash_map se supone que es "lock-less", pero escriben: "Como tener acceso a un elemento puede bloquear otros hilos, intente acortar la vida útil del acceso o const_accessor". No es lo suficientemente bueno para mí en este caso. – viraptor