Pregunta

Propósito

Estoy escribiendo una pequeña biblioteca para la cual la portabilidad es la mayor preocupación. Ha sido diseñado para asumir solo un entorno C90 (ISO / IEC 9899: 1990) mayormente compatible ... nada más. El conjunto de funciones proporcionadas por la biblioteca funciona (lectura / escritura) en una estructura de datos interna. He considerado algunas otras alternativas de diseño, pero nada más parece factible para lo que la biblioteca es tratando de lograr .

Pregunta

¿Existen algoritmos, técnicas o encantamientos portátiles que puedan usarse para garantizar la seguridad de los hilos? No me preocupa hacer que las funciones sean reentrantes. Además, no me preocupa la velocidad o (posiblemente) desperdiciar recursos si el algoritmo / técnica / encantamiento es portátil. Idealmente, no quiero depender de ninguna biblioteca (como GNU Pth) u operaciones específicas del sistema (como atomic test-and-set).

He considerado modificar el algoritmo de panadería de Lamport , pero no sé cómo modifíquelo para que funcione dentro de las funciones llamadas por los hilos en lugar de trabajar en los hilos mismos.

Cualquier ayuda es muy apreciada.

¿Fue útil?

Solución

El algoritmo de panadería de Lamport probablemente funcionaría; Desafortunadamente, todavía hay problemas prácticos con él. Específicamente, muchas CPU implementan operaciones de memoria fuera de orden : incluso si usted He compilado su código en una secuencia de instrucciones perfectamente correcta, la CPU, al ejecutar su código, puede decidir reordenar las instrucciones sobre la marcha para lograr un mejor rendimiento. La única forma de evitar esto es usar barreras de memoria , que son altamente sistemas y CPU -específico.

Realmente solo tiene dos opciones aquí: (1) mantener su biblioteca insegura de hilos y hacer que sus usuarios lo sepan en la documentación, o (2) usar un mutex específico de la plataforma. La opción 2 se puede facilitar utilizando otra biblioteca que implemente mutexes para una gran variedad de plataformas y le brinde una interfaz unificada y abstracta.

Otros consejos

Sin soporte de sistema operativo / hardware, al menos un CAS atómico, no hay nada que pueda hacer que sea práctico. Sin embargo, hay bibliotecas portátiles que abstraen varias plataformas en una interfaz común.

http://www.gnu.org/software/pth/related.html

Casi todos los sistemas (incluso Windows) pueden ejecutar libpthread en estos días.

Las funciones no pueden ser seguras para subprocesos o innatamente seguras para subprocesos, dependiendo de cómo desee verlas. Y el enhebrado / bloqueo es innato de una plataforma específica Realmente, depende de usuarios de su biblioteca manejar los problemas de subprocesos.

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