Flock() o flockfile(): qual è thread-safe?

di il
4 risposte

Flock() o flockfile(): qual è thread-safe?

Salve.

La domanda è un pò a cavallo tra il linguaggio C strettamente considerato e le system call dei sistemi UNIX-like; spero che non abbia sbagliato sezione a causa di questa ambiguità.

Ho diversi thread dei quali non conosco a priori la quantità, perchè ognuno di essi gestisce una connessione da socket.
Ci sono poi diversi file (anche di questi non conosco a priori la quantità) che possono venire scritti o letti dai thread.

Le richieste sono le seguenti:
-se diversi thread hanno intenzione di scrivere sullo stesso file, allora soltanto uno per volta può farlo (non importa l'ordine, ma è necessario che ognuno scriva tutti i suoi dati senza "mischiarli" con altri);
-se N thread vogliono scrivere su N file differenti, allora tutti possono farlo contemporaneamente;
-se diversi thread vogliono leggere lo stesso file, possono farlo contemporaneamente;
-mentre un thread legge un file, nessun altro può scrivere su quello stesso file.

Praticamente mi serve un qualche meccanismo di locking, esclusivo o condiviso.

Consultando la manualistica, nella libc ho trovato la funzione flockfile() che agisce su FILE e, da quanto riportato, potrebbe essere thread-safe.

Ma volendo agire a livello più basso, a livello di sistema operativo, è possibile utilizzare flock()?
Nella manualistica non è esplicitamente riportato il suo essere o meno thread-safe, ma è chiaramente spiegato che il lock si applica al file stesso e non al suo descrittore (che è unico per diversi thread di un unico processo). Potrebbe, quindi, essere ugualmente utilizzabile?

Tutto questo, ovviamente, nell'ipotesi (spero confermata) che le funzioni di acquisizione del lock, in entrambi i casi, siano atomiche.

4 Risposte

  • Re: Flock() o flockfile(): qual è thread-safe?

    Consultando la manualistica, nella libc ho trovato la funzione flockfile() che agisce su FILE e, da quanto riportato, potrebbe essere thread-safe.
    La manualistica riporta che è thread-safe come tutte le funzioni definite nel stdio.
    Ma volendo agire a livello più basso, a livello di sistema operativo, è possibile utilizzare flock()?
    Nella manualistica non è esplicitamente riportato il suo essere o meno thread-safe, ma è chiaramente spiegato che il lock si applica al file stesso e non al suo descrittore (che è unico per diversi thread di un unico processo). Potrebbe, quindi, essere ugualmente utilizzabile?
    No.

    edit:
    form man flock(2) #Note
    flock() places advisory locks only; given suitable permissions on a file, a process is free to ignore the use of flock() and perform I/O on the file.

    flock() and fcntl(2) locks have different semantics with respect to forked processes and dup(2). On systems that implement flock() using fcntl(2), the semantics of flock() will be different from those described in this manual page.

    Converting a lock (shared to exclusive, or vice versa) is not guaranteed to be atomic: the existing lock is first removed, and then a new lock is established. Between these two steps, a pending lock request by another process may be granted, with the result that the conversion either blocks, or fails if LOCK_NB was specified. (This is the original BSD behavior, and occurs on many other implementations.)
  • Re: Flock() o flockfile(): qual è thread-safe?

    Grazie mille!

    In questo modo, però, come soddisfo la richiesta
    -se diversi thread vogliono leggere lo stesso file, possono farlo contemporaneamente;
    ?

    Se il file X dovesse essere letto contemporaneamente da N thread, il primo tra questi che acquisisce il lock impedisce automaticamente a tutti gli altri N-1 l'accesso in sola lettura.

    Se invece iniziassi la lettura (sempre tramite funzioni fornite da stdio) senza richiedere un lock, allora violerei la richiesta per la quale se un thread scrive (acquisendo un lock) nessuno può più leggere.

    Voglio dire, se in un thread chiamassi (ad esempio) una fscanf() per leggere un file, e mentre questa è in corso un altro thread richiedesse un lock e lo ottenesse per iniziare a scrivere, cosa succede alla fscanf()?
  • Re: Flock() o flockfile(): qual è thread-safe?

    Non so risponderti se non suggerirti soluzioni semaforiche o monitor.
  • Re: Flock() o flockfile(): qual è thread-safe?

    Grazie comunque!

    I semafori sono stati il primo pensiero, però non avendo a priori una quantità di file e di thread che devono gestirli, diventa complicato.

    Per questo sono passato subito al flock() che permette anche un lock condiviso (per la lettura), ma il fatto che non sia thread-safe è problematico.
Devi accedere o registrarti per scrivere nel forum
4 risposte