2010-05-17 11 views
5

Actualmente estoy usando el siguiente código para el acceso seguro a subprocesos de una variable.obtención de subprocesos (método de acceso)

int gnVariable; 

void getVariableValue(int *pnValue) 
{ 
    acquireLock(); //Acquires the protection mechanism 
    *pnValue = gnVariable; 
    releaseLock(); //Releasing the protection mechanism 
} 

me gustaría cambiar mi firma API para una más fácil de usar

int getVariableValue(void); 

¿Cómo debo reescribir la función - de tal manera que los usuarios de la API no tienen que preocuparse por la ¿bloquear/desbloquear detalles?

+0

No recibo su pregunta. Ninguna versión de su API propuesta expone detalles de bloqueo. – zvrba

+0

si se cambia a la segunda versión - int getVariable (void) -, el usuario de la API tendría que liberar/desbloquear el semáforo manualmente. si no haces lo que Samuel y Naveen sugieren – sonofdelphi

Respuesta

9

Dado que le dio C++ como opción, puede ajustar el bloqueo/desbloqueo de exclusión mutua. A continuación, puede devolver el valor directamente:

class lock_wrapper 
{ 
public: 
    lock_wrapper() 
    { 
     acquireLock(); 
    } 
    ~lock_wrapper() 
    { 
     releaseLock(); 
    } 
}; 

int getVariableValue() 
{ 
    lock_wrapper lw; 
    return gnVariable; 
} 

Esto también será muy útil si alguna vez tiene que hacer un bloqueo/desbloqueo de alrededor de código que puede lanzar una excepción.

+0

alguna idea para hacer lo mismo en C? – sonofdelphi

+1

Solía ​​usar semáforos de conteo para esto. El conteo de semáforos en algunos RTOS respalda la operación getValue(), que opera atómicamente. – sonofdelphi

+0

@sonofdelphi - para C, debe usar la técnica de la respuesta de Naveen. –

8

Devuelve una copia de la variable local. Algo así como:

int getVariableValue(void) 
{ 
    int local= 0; 
    acquireLock(); 
    local = gnVariable; 
    releaseLock(); 
    return local; 
} 

Como nota al margen, es mejor RAII principio para el bloqueo en lugar de acquireLock y releaseLock métodos.

+0

, la copia local parece algo poco elegante. :) ¿No va otro? – sonofdelphi

+0

@sonofdelphi: @R Samuel Klatchko es una mejor solución. Solo quería demostrar cómo hacerlo usando copia local. – Naveen

+2

@sonofdelphi: La variable local debe ser optimizada por un compilador decente - copiará el 'gnVariable' directamente en la ubicación del valor de retorno. – caf

Cuestiones relacionadas