2009-04-01 11 views

Respuesta

14

Quizás.

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

  • En un solo núcleo, profundamente arraigadas medio ambiente sin un sistema operativo involucrado normalmente se puede desactivar y activar las interrupciones. Esto se puede usar para permitir que una función sea atómica contra el código del controlador de interrupción. Pero si tiene un bus multimaestro, un motor DMA u otro dispositivo de hardware que pueda escribir memoria de forma independiente, incluso las interrupciones de enmascaramiento pueden no proporcionar una garantía lo suficientemente fuerte en algunas circunstancias.

  • En un entorno RTOS (sistema operativo en tiempo real), el núcleo del sistema operativo generalmente proporciona primitivas de sincronización de bajo nivel, 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. Por lo general, es fundamental para la implementación del sistema operativo de otras primitivas de sincronización.

  • En un entorno de múltiples núcleos, a menudo está disponible una primitiva de bajo nivel llamada spinlock. Se usa para proteger contra la entrada a un bloque de código que debe ser atómico con respecto a otros usuarios del mismo objeto de spinlock, y opera bloqueando el núcleo de la CPU en espera en un ciclo cerrado hasta que se libere el bloqueo (de ahí el nombre).

  • En muchos entornos de subprocesamiento, el marco de subprocesos proporciona primitivas más complejas como eventos, semáforos, mutexes y colas. Estos cooperan con el programador de subprocesos de manera que los subprocesos que esperan que ocurra algo no se ejecutan en absoluto hasta que se cumple la condición. Se pueden usar para hacer que las acciones de una función sean atómicas con respecto a otras que comparten el mismo objeto de sincronización.

Una regla general sería utilizar las capacidades de más alto nivel disponibles en su entorno que sean adecuadas para la tarea. En el mejor de los casos, se puede usar un objeto seguro para subprocesos existente, como una cola de mensajes, para evitar tener que hacer algo especial en su código.

1

No es portable, por lo menos. Para algunos sistemas, probablemente pueda abordarlo, haciendo cosas como desactivar las interrupciones de la máquina, para evitar que el kernel se adecue a su función. Pero será muy difícil, especialmente para sistemas no integrados.

3

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 .

Ver man sigprocmask para más detalles.

1

Necesitará soporte específico de la plataforma para hacerlo, ya sea mediante el uso de compiladores intrínsecos especiales para las instrucciones de hardware o mediante el soporte del sistema operativo. Ni C ni C++ tienen elementos de sincronización estandarizados.

1

Define lo que quieres decir con 'atomic.' ¿Quiere decir 'atómico' en el sentido de que no se seleccionará ningún otro proceso o hilo para la programación cuando ejecute su función?¿O quiere decir que los objetos compartidos a los que se hace referencia en su función no serán modificados por ningún otro subproceso mientras se ejecuta su función?

Para el primero, no se puede controlar realmente desde el espacio de usuario. Si está en una máquina con una sola CPU puede posiblemente garantizar la atomicidad elevando la prioridad de su proceso a la prioridad más alta posible (desde el espacio de usuario). Pero incluso así no está garantizado porque su algoritmo de programación aún puede permitir que se ejecute otro proceso. La única manera confiable de hacerlo es desde el sistema operativo. Para una máquina con una sola CPU, desactivas las interrupciones. Para una máquina multi-core, necesitaría bloquear el bus y esperar a que se quitaran todos los procesos que se ejecutan en otras CPU.

La pregunta aquí es: ¿por qué quiere garantizar la atomicidad? En general, el requisito de que solo su proceso se esté ejecutando y no otros, no debería existir en el espacio de usuario. Si desea asegurarse de que solo se accede a ciertas estructuras de datos por un hilo a la vez, entonces debe usar una biblioteca de hilos portátil (como pthread por ejemplo) y delimitar su función como una sección crítica.

1

Si por atómico te refieres a 'solo un hilo a la vez', entonces podrías proteger la función con un bloque de sección crítica (en Windows). En Linux, uso un bloqueo/desbloqueo mutex para emular más o menos una sección crítica.

0

Es posible que desee buscar semáforos POSIX, mutexes o similares, que podrían funcionar tanto en Windows como en Linux.

Usando p. Ej. cygwin o minGW incluso es posible escribir código portátil 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

Cuestiones relacionadas