Como estaba algo confundido, empiezo aclarando algunos conceptos en la pregunta.
Colección . No veo ninguna razón para pasar el tiempo definiendo rigurosamente lo que significa "colección" cuando simplemente podemos preguntar qué sucede con las estructuras de datos en general. Una estructura de datos ocupa un trozo de memoria y tiene algunas operaciones que pueden acceder a esa memoria y que los usuarios pueden invocar . Estos usuarios pueden ser procesadores distintos o simplemente hilos diferentes, no nos concierne. Lo único que importa es que puedan ejecutar operaciones en paralelo.
Sin bloqueo . Herlihy y Boss dicen que una estructura de datos está libre de bloqueos cuando un usuario que falla no impide usos adicionales de la estructura de datos. Por ejemplo, imagine que uno vierte agua en un procesador que está insertando un nodo en un conjunto ordenado. Bueno, si otros procesadores intentan insertarse más tarde en ese conjunto ordenado, deberían tener éxito. ( Edición: De acuerdo a esta definición, es el caso que si utiliza una estructura de datos cerraduras entonces no es lock-libre, pero es no el caso de que si una estructura de datos no utiliza las cerraduras entonces es libre de bloqueo).
Con esta definición, creo que Herlihy y Boss básicamente dicen que la respuesta es convertir las regiones críticas en transacciones.
Pero, usted puede preguntar, ¿tiene esto la misma complejidad? No estoy seguro de que la pregunta tenga sentido. Considere push(x) { lock(); stack[size++] = x; unlock(); }
. ¿Es esta una operación de tiempo constante? Si ignora la operación de bloqueo y, por lo tanto, otros usuarios, puede responder SÍ. Si no desea ignorar a otros usuarios, entonces realmente no hay forma de decir si la inserción se ejecutará en tiempo constante. Si subes un nivel y ves cómo un algoritmo particular usa la pila, entonces podrías decir que el empuje siempre tomará un tiempo constante (medido ahora en términos de lo que sea que sea la entrada de tu algoritmo paralelo). Pero eso realmente es una propiedad de su algoritmo, por lo que no tiene sentido decir que push es una operación de tiempo constante.
En resumen, si ignora cuánto espera un usuario que ejecuta una operación a otros usuarios, el uso de transacciones en lugar de regiones críticas responde a su pregunta afirmativamente. Si no ignora el tiempo de espera, debe observar cómo se utiliza la estructura de datos.