una - ¿Hay un envoltorio decente de C++ alrededor del SList sin cerradura de Win32?
programa en dev c++ para una tienda (4)
Creo que un envoltorio delgado debería ser muy fácil de escribir. algo así como 1 o 2 páginas, posiblemente todas en el archivo .h. En lugar de peinar google, ya lo escribiría yo mismo.
Windows proporciona una lista enlazada individualmente sin cerrojo, como se documenta en esta página: Win32 SList
Me pregunto si existe una buena capa de C ++ alrededor de esta funcionalidad. Cuando digo bueno, me refiero a que exporta la interfaz STL habitual tanto como sea posible, admite iteradores, etc. Prefiero usar la implementación de otra persona que sentarme a escribir un contenedor de tipo STL.
No podrás superponer una interfaz de estilo STL encima de SList. Para evitar problemas de administración de memoria, el único nodo en la lista a la que se puede acceder es el encabezado de la lista. Y la única forma de acceder a ese nodo es sacándolo de la lista. Esto evita que dos subprocesos tengan el mismo nodo y luego un subproceso que borre ese nodo mientras el otro subproceso todavía lo está utilizando. Esto es lo que quiero decir con "problemas de administración de memoria" y es un problema común en la programación sin bloqueos. Siempre puede abrir el primer nodo y luego seguir los punteros "Siguiente" en SLIST_ENTRY, pero esta es una idea muy mala a menos que pueda garantizar que la lista no se contraerá, con los nodos siendo desasignados, mientras la está leyendo. Por supuesto, esto aún elimina el nodo principal de la lista.
Básicamente, estás tratando de usar SList incorrecto. Por lo que parece que quieres hacer, solo necesitas usar un contenedor STL y proteger el acceso a él usando un candado. Los algoritmos STL no funcionarán con estructuras de datos libres de bloqueo que sean mudables como SList.
Dicho todo esto, podría crear un contenedor C ++ alrededor de SList pero no sería compatible con STL.
Puede comenzar a usar rápidamente boost y :: boost :: iterator_facade.
No, no sería óptimo ni portátil, y la semántica de los iteradores es algo de lo que debería escuchar a Alexandrescou enfrentarse de repente en DevCon. No está bloqueando el contenedor, está bloqueando (y posiblemente rebloqueando y desbloqueando) las operaciones. Y bloquear la operación significa una ejecución en serie, muy simple. Hay mucha manipulación de iteradores que será una penalización innecesaria para la abstracción que se está creando.
Desde la vista de Marte, el iterador oculta el puntero y esconderse bajo un concepto semi-OO que es tan diferente como el desarrollo OO-vs-Distribuido. Usaría una interfaz de ''procedimiento'' y haría pagar a los usuarios / mantenedores atención a por qué es necesario. Las operaciones sin bloqueo solo son tan buenas como ''todo el código paralelo'' que lo rodea. Y ejemplos clásicos, ya que las personas siguen dando reinicio de envoltura de scoped_lock desde el crédito de 1996, produce un bonito código de serie.
O utilice las entradas atómicas y DDJ de Sutter como referencia para el camino del pobre (y más de 10 años de desorden de Pentium Pro más adelante).
(Todo lo que realmente está sucediendo es que boost y DDJ se ejecutan después de un tren .net y MS CCR que se ejecuta después de la inmutabilidad, así como el tren Intel que se ejecuta después de una buena abstracción similar a OO para el desarrollo sin bloqueos. El problema es no se puede hacer bien y algunas personas lo combaten una y otra vez, al igual que el truco concurrente de TBB. La misma razón por la que las excepciones nunca se materializan como no problemáticas, especialmente entre entornos, y la misma razón por la que el procesamiento vectorial en CPU es infrautilizado por C ++ compiladores y así sucesivamente ...)
Vale la pena notar que la interfaz publicada en la página citada en la pregunta no implementa de hecho una lista vinculada (aunque puede tratarse de una estructura subyacente): implementa una pila. Por lo tanto, si desea las características de una lista vinculada que proporcionan clases como std :: list, puede que no sea para usted.
También tenga en cuenta que las pilas no pueden soportar iteradores (básicamente, solo admiten push y pop), por lo que gran parte de la conversación sobre el apoyo de iteradores y algoritmos es una ilusión.