View Full Version : [C/C++] File locking tra pthreads
Cercando qua e là non mi è mai capitato di incontrare una funzione equivalente al LockFile di windows, cioè che faccia il lock esclusivo o condiviso tra threads (anche di diversi processi) per i pthreads
Ora, mi trovo ad averne bisogno e mi chiedevo, non c'è proprio niente che faccia al caso mio e sarò costretto a inventarmi improbabili combinazioni di flock (o fcntl, insomma lock dei file tra i processi) e rwlock o c'è qualcosa che posso usare direttamente?
Teo@Unix
28-03-2011, 00:25
Prova a guardarti la struttura pthread_mutex_t e le varie funzioni:
http://linux.die.net/man/3/pthread_mutex_lock
ah ecco, perfetto, pthread_rwlockattr_setpshared fa al caso mio, thank you
in realtà non fa al caso mio come credevo, per il semplice fatto che è necessario condividere la memoria in cui è allocato il lock per poterlo utilizzare.. ma non c'è una soluzione standard? insomma mi sembra un problema tipico quello di lockare un file, eppure non trovo niente che faccia quel che voglio :/ (cioè l'equivalente di flock, fcntl o lockf per i thread)
Cercando qua e là non mi è mai capitato di incontrare una funzione equivalente al LockFile di windows, cioè che faccia il lock esclusivo o condiviso tra threads (anche di diversi processi) per i pthreads
Ora, mi trovo ad averne bisogno e mi chiedevo, non c'è proprio niente che faccia al caso mio e sarò costretto a inventarmi improbabili combinazioni di flock (o fcntl, insomma lock dei file tra i processi) e rwlock o c'è qualcosa che posso usare direttamente?
Perche' non puoi usare il solo flock ?
perché flock fa mutua esclusione tra i processi, non tra i thread di uno stesso processo, ad esempio
alla fine penso che userò un segmento di memoria condiviso in cui mettere una qualche struttura dati che contiene i miei rwlock indicizzati per numero di inode
a questo proposito, l'ideale sarebbe una std::map.. ma c'è qualche modo per allocare un oggetto dove dico io (nel mio caso, nel segmento che prendo con shmget), e posso essere sicuro che non venga allocato niente al di fuori? ad esempio che non ci siano "new" all'interno, che sarebbero un problema
perché flock fa mutua esclusione tra i processi, non tra i thread di uno stesso processo, ad esempio
Giusto, me n'ero dimenticato
alla fine penso che userò un segmento di memoria condiviso in cui mettere una qualche struttura dati che contiene i miei rwlock indicizzati per numero di inode
a questo proposito, l'ideale sarebbe una std::map.. ma c'è qualche modo per allocare un oggetto dove dico io (nel mio caso, nel segmento che prendo con shmget), e posso essere sicuro che non venga allocato niente al di fuori? ad esempio che non ci siano "new" all'interno, che sarebbero un problema
Se non ricordo male in boost::inteprocess dovrebbe esserci una versione portabile che fa quel che ti serve, senza dover ricorrere a delle mappe.
In ogni caso per il discorso della map dovresti passarle un allocatore tuo (che vada ad allocare dalla memoria condivisa), non una passeggiata.
Giusto, me n'ero dimenticato
Se non ricordo male in boost::inteprocess dovrebbe esserci una versione portabile che fa quel che ti serve, senza dover ricorrere a delle mappe.
In ogni caso per il discorso della map dovresti passarle un allocatore tuo (che vada ad allocare dalla memoria condivisa), non una passeggiata.intanto ho dimenticato di premettere che è un progetto per un corso di programmazione di sistema (server e client tftp windows e linux) e non posso utilizzare librerie che mi semplifichino il lavoro in questo modo
ok, sembra abbastanza complicato in effetti gestire correttamente la memoria in questo modo.. magari mi conviene usare una più semplice hash table :asd:
per altro avrei anche il problema che per fare molte cose (ad esempio inizializzare gli rwlock con pthread_rwlock_t) dovrei lockare il segmento, e mi sembra di capire che non sia proprio un'operazione standard, e comunque richiede i privilegi di root (che potrebbe anche andare bene per il server, ma per il client richiedere i privilegi di root mi sembra esagerato)
ps: soluzioni meno complicate sono sempre molto bene accette :asd:
DanieleC88
24-06-2011, 14:35
intanto ho dimenticato di premettere che è un progetto per un corso di programmazione di sistema (server e client tftp windows e linux)
:eek:
Bernaschi? :sofico:
Io sto lavorando ad un server SMTP/POP con simili caratteristiche, e sono incappato nello stesso problema. Casomai trovassi una buona soluzione lo scriverò qui (o casomai l'abbia trovata tu, condividila :p).
sì sì, progetto consegnato etc, manca solo la verbalizzazione :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.