2012-04-09 15 views
5

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.

+3

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 :) –

+1

@ RafałRawicki: "No hagas nada, porque es difícil". Tal vez solo lo necesite porque los mutexes son una mierda. – Cartesius00

+0

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) –

Respuesta

3

Es posible que no impida la preferencia de un subproceso de modo de usuario. Las secciones críticas (y todos los demás objetos de sincronización) evitan las colisiones de tus hilos, sin embargo, de ninguna manera impiden que el sistema operativo pueda precederlos.

Si su otra rama hilos en algo de tiempo de espera, mientras que algo puede conducir a un callejón sin salida - que tiene un problema de diseño.

Un diseño correcto debería ser el más pesimista: la preferencia puede ocurrir en todas partes por tiempo indeterminado.

+0

La investigación adicional me ha llevado a funciones atómicas incorporadas proporcionadas por los compiladores. Por ejemplo, el manual de GCC 4.7, la sección 6.52 aborda las operaciones atómicas. Creo que necesito una __atomic_thread_fence pero no estoy seguro de si eso proporciona la protección preventiva que necesito. – wapadomo

Cuestiones relacionadas