Pregunta

Hay una manera para hacer que una función atómica en C.

Yo no estoy en busca de una solución portátil.(plataformas buscando - Win,Linux)

¿Fue útil?

Solución

Tal vez.

Depende enteramente de su definición de "atómica".

  • En un solo núcleo, profundamente arraigados medio ambiente sin un sistema operativo participan generalmente, usted puede deshabilitar y habilitar las interrupciones.Esto puede ser usado para permitir que una función sea atómica contra controlador de interrupción de código.Pero si usted tiene un multi-master, un autobús de motor DMA, o algún otro dispositivo de hardware que se puede escribir de memoria de forma independiente, incluso de enmascaramiento de interrupciones pueden no proporcionar una lo suficientemente fuerte como garantía en algunas circunstancias.

  • En un RTOS (sistema operativo en tiempo real) el medio ambiente, el núcleo del sistema operativo proporciona generalmente de bajo nivel de primitivas de sincronización, tales como secciones críticas.Una sección crítica es un bloque de código que se comporta "esencialmente" atómicamente, al menos con respecto a todas las demás secciones críticas.Normalmente es fundamental para el sistema operativo de la aplicación de otras primitivas de sincronización.

  • En un entorno de múltiples núcleos, un bajo nivel primitivo llamado un spinlock es a menudo disponibles.Se utiliza para proteger contra el acceso a un bloque de código que debe ser atómica, con respeto a los demás usuarios de la misma spinlock objeto, y funciona mediante el bloqueo de la sala de espera del núcleo de la CPU en un bucle ajustado hasta que se libera el bloqueo (de ahí el nombre).

  • En muchos roscado entornos más complejos primitivas tales como eventos, semáforos, mutexes, y las colas son proporcionados por el hilo marco.Estos cooperar con el programador del subproceso tal que los subprocesos en espera de que ocurra algo no funciona en absoluto hasta que la condición se cumple.Estos pueden ser usados para hacer que una función de las acciones del atómica con respecto a otros hilos que comparten el mismo objeto de sincronización.

Una regla general sería la de utilizar el más alto nivel de las capacidades disponibles en su entorno que son adecuados para la tarea.En el mejor de los casos, un hilo ya existente seguro objeto, tal como un mensaje de la cola puede ser utilizado para evitar la necesidad de hacer nada especial en su código.

Otros consejos

Si desea asegurarse de que su función no se verá interrumpido por la señal, utilice sigprocmask() para enmascarar y desenmascarar las señales, aunque algunas señales no pueden ser bloqueadas (como SIGKILL) y el comportamiento para bloquear algunas señales (como SIGSEGV) no está definido.

Vea man sigprocmask para más detalles.

No es portable, por lo menos. Para algunos sistemas, es probable que pueda acercarse a ella, haciendo cosas como el giro de las interrupciones de la máquina, para evitar que el núcleo de adelantarse a su función. Pero va a ser muy difícil, especialmente para los sistemas no incrustados.

Usted necesitará el apoyo específico de la plataforma de hacerlo - ya sea a través del uso de las características intrínsecas del compilador especiales para instrucciones de hardware, o mediante el apoyo del sistema operativo. Ni C ni C ++ ha estandarizado cosas sincronización.

Definir lo que quiere decir con 'atómica'. Qué quiere decir 'atómica' en el sentido de que serán seleccionados ningún otro proceso o subproceso para la programación al ejecutar la función? ¿O quiere decir que los objetos compartidos que se hace referencia en su función no serán modificados por cualquier otro hilos, mientras que su función se ejecuta?

En el primer caso, realmente no se puede controlar que desde el espacio de usuario. Si estás en una máquina de una sola CPU puede posiblemente garantía de atomicidad levantando la prioridad del proceso de la prioridad más alta posible (desde el espacio de usuario). Pero incluso entonces no está garantizado debido a que su algoritmo de planificación puede todavía permitir que otro proceso se ejecute. La única manera confiable de hacer esto es desde el sistema operativo. Para una máquina de un solo CPU desea deshabilitar interrupciones. Para una máquina multi-núcleo que había necesidad de bloquear el autobús y esperar a que todos los procesos que se ejecutan en otras CPU a ser retirados.

La pregunta aquí es:? ¿por qué quiere garantizar la atomicidad En general, el requisito de que sólo su proceso puede estar en ejecución y no en otros, no debe existir en el espacio de usuario. Si desea asegurarse de que ciertas estructuras de datos son accesibles únicamente por un hilo a la vez, entonces se debe utilizar una biblioteca portátil hilo (como pthread por ejemplo), y cercar su función como una sección crítica.

Si por atómica quiere decir 'sólo un hilo a la vez', entonces se podría simplemente proteger la función con un bloque de sección crítica (en Windows). En Linux, yo uso un bloqueo mutex / desbloquear a más o menos emular una sección crítica.

Es posible que desee ver en los semáforos POSIX, exclusiones mutuas o similares, que podría funcionar en Windows y Linux.

Uso de por ejemplo Cygwin o MinGW es incluso posible escribir código portable entre Linux y Windows.

Aún mejor, puede crear bibliotecas de Windows en Linux: http : //cdtdoug.blogspot.com/2009/05/mingw-cross-for-linux.html

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