2011-07-27 15 views
5

Buscando la respuesta de this pregunta Encontré la función _locking(). Allí dice que es Locks or unlocks bytes of a file (en realidad no puedo entender qué significa realmente esta oración). Si alguien tiene experiencia en el uso de esta función, ¿es posible utilizar la función para resolver el problema descrito en la primera pregunta?¿Qué hace _locking() realmente?

Respuesta

1

Citando la página de MSDN se conectó:

int _locking(
    int fd, 
    int mode, 
    long nbytes 
); 

El _locking función bloquea o desbloquea nbytes bytes del archivo especificado por fd . Bloquear bytes en un archivo impide el acceso a esos bytes por otros procesos. Todo el bloqueo o desbloqueo comienza en la posición actual del puntero de archivo y continúa para el siguiente nbytes bytes. Es posible bloquear bytes más allá del final del archivo.

+0

Sí, he leído esto. Pero cuando intenté bloquear un archivo, no pude escribir en el archivo a través del flujo en el mismo proceso. Entonces, ¿qué significa realmente bloquear bytes? –

+0

¿O tal vez funciona incorrectamente para Win7? –

0

http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx

he encontrado que esto ayuda a "fijar" el problema Race condition!

La última persona en escribir en un archivo gana. Supongamos que solo necesita leer la primera mitad de un archivo, sin motivo para bloquear todo el archivo.

Para tomar el tamaño del archivo en bytes, páselo a esta función y luego bloquéelo.

La función volverá a ser 0 si tiene éxito. Un valor de retorno de -1 indica falla, en cuyo caso errno se establece en lo que le dice la página de MSDN.

Para responder a su pregunta

Puede tomar el tamaño del archivo y bloqueo hacia abajo, sino que sólo será capaz de leer el archivo de formar. lo bloquea en una especie de modo de lectura solamente.

En la wiki de condición de carrera, le dirá ejemplos de cómo bloquear un archivo obteniendo un segundo proceso para buscar un indicador que podría funcionar en su caso.

1

Simplemente reserva un rango de un archivo para el uso exclusivo del proceso que adquiere el bloqueo de archivo. Si una llamada de bloqueo tiene éxito, otro proceso que intente leer o escribir esa parte del archivo fallará. Esto permite que múltiples procesos accedan al mismo archivo y lo actualicen de manera coherente. Es como un mutex para un rango de un archivo.

Básicamente le permite actualizar partes de un archivo atómicamente, por lo que cualquier otro proceso de lectura o escritura del archivo verá (o cambiará) todas las actualizaciones, o ninguna. También se aplica a la lectura: puede bloquear un rango de un archivo que desea leer para evitar que otro proceso cambie parte de él mientras está en el medio de leerlo.

Pero los procesos todavía pueden acceder a otras partes del archivo sin error o demora.

No resolverá el problema en la pregunta a la que se refiere porque _lock() en; t funciona en una granularidad de proceso. Si el hilo A bloquea un rango de archivos, entonces el hilo B en ese mismo proceso aún puede leer/escribir ese rango.Para evitar que otro subproceso en el mismo proceso acceda a un rango de archivos, el proceso debería implementar su propio mecanismo interno para respetar que un rango de archivos haya sido bloqueado por otro subproceso. Al menos no estoy al tanto de algo que hace eso en la API de Win32 (supongo que podría haber algo de lo que no estoy seguro).

+0

Esta función bloquea el archivo de todas las escrituras y lo hace legible solo a partir de esos bytes. el usuario puede agregar fácilmente una bandera que sea globo para que los hilos se revisen antes de ingresar el archivo. –

+0

@Dennis: de acuerdo con los documentos, el bloqueo impide cualquier acceso, de lectura o escritura, al rango. Tendría que hacer algunas pruebas para comprobar si ocurría lo contrario. Y eso también tiene sentido, si el proceso A está cambiando un registro en el archivo, el proceso B no querrá leer el registro hasta que se complete la actualización. –

+0

@Dennis: también no sobreestime lo fácil que puede ser 'agregar una bandera'. Si desea que las comprobaciones de acceso entre subprocesos sean granulares a rangos de archivos, debe mantener algún tipo de estructura de datos que indique qué rangos están bloqueados y necesita mecanismos de sincronización (objetos de sección crítica o lo que sea) para administrar el acceso a esos datos estructura. No es tan trivial como consultar una bandera. Además, deberá * agregar explícitamente * cheques de acceso donde sea necesario. Si no haces el control en todos los momentos correctos, entonces el hilo B accederá al rango, mientras que el hilo A lo tiene 'bloqueado'. –

0

Impide que otros procesos accedan a la misma parte del archivo.

+0

acceso incluye acceso de lectura? – smerlin

+0

@smerlin: Sí; es exclusivo. – Mehrdad

Cuestiones relacionadas