Tengo un pedazo simple de trabajo determinista que solo necesita trece instrucciones de máquina para completar. Debido a que la primera instrucción toma un semáforo hecho en casa (spinlock) y la última instrucción lo libera, estoy a salvo de todos los otros hilos que se ejecutan en los otros núcleos, ya que están tratando de tomar y dar el mismo semáforo.Cómo puedo evitar la preferencia de mi hilo en el modo de usuario
El problema surge cuando un hilo interrumpe un hilo que sostiene el semáforo antes de que pueda terminar su "sección crítica". En el peor de los casos, la interrupción mata el hilo mientras se mantiene el semáforo o, como puede suceder, uno de los hilos que normalmente compite por el semáforo se bifurca en un código que puede generar la interrupción y provocar un punto muerto.
No tengo manera de sincronizar con estos otros hilos cuando se ramifican en aquellas partes del código que no puedo controlar. Creo que necesito deshabilitar las interrupciones como solía hacer en mis viejos días VxWorks cuando estaba ejecutando en modo kernel. Siempre hay trece instrucciones y siempre estoy completamente seguro si puedo completar las trece instrucciones antes de tener que aceptar una interrupción. Ah, y es todo mi propio dato interno, aparte de que el semáforo hecho en casa no es nada que bloquee cualquier otra cosa.
He leído varias respuestas que creo que están cerca. La mayoría tiene que ver con las llamadas de Sección crítica en la API de Windows (sistema operativo incorrecto, pero tal vez el concepto correcto). La mayoría de las soluciones incorrectas suponen que puedo obtener todos los subprocesos ofensivos para usar un mutex que creo con las bibliotecas pthread.
Necesito esta solución en C/C++ en Linux y Solaris. La pregunta de
Johnny Crash está muy cerca prevent linux thread from being interrupted by scheduler
KermitG también Can I prevent a Linux user space pthread yielding in critical code?
Gracias por su consideración.
Use mutexes de su biblioteca de hilos (pthread) y lea la documentación cuidadosamente. No implemente sus propias primitivas de sincronización. La programación en paralelo es difícil :) –
@ RafałRawicki: "No hagas nada, porque es difícil". Tal vez solo lo necesite porque los mutexes son una mierda. – Cartesius00
posible duplicado de [evitar que el programador interrumpa el hilo de Linux] (http://stackoverflow.com/questions/2595735/prevent-linux-thread-from-being-interrupted-by-scheduler) –