PDA

Visualizza la versione completa : [c++ win32] Thread bloccante


Stoicenko
25-09-2009, 09:41
Salve,

Ho un thread che fa degli accessi al disco (con la readfile) usando un handle al file di un altro thread..

essendo che l'altro thread non "usa" direttamente quell'handle non ho previsto semafori o critical section per gestire tale handle.. infatti il thread legge solamente.. sul file non si scrive mai in tutto il programma..

Ho notato che, per file sopra ai 2 o 3 gb, la read file inizia ad essere "lenta"..

L'anomalia che ora vi riporto è questa..

Visto che ho notato che il thread possessore dell'handle al file (ma non lo usa) si blocca quando l'altro thread lo usa in lettura, è possibile che la readfile sia bloccante?

A me sembra un'assurdità, infatti senza semafori o altro come può un thread "fermarsi" perchè un altro usa una sua variabile?

oregon
25-09-2009, 10:02
Da MSDN:

"Considerations for working with synchronous file handles:

If lpOverlapped is NULL, the read operation starts at the current file position and ReadFile does not return until the operation is complete, and the system updates the file pointer before ReadFile returns."

Stoicenko
25-09-2009, 10:04
ok questo mi era chiaro..

infatti mi spetto che il thread che fa la readFile sia fermo in attesa che finisca.. ma l'altro? il possessore di tale handle (che poi non usa)

oregon
25-09-2009, 10:07
L'altro thread non usa l'handle e si blocca comunque?

Stoicenko
25-09-2009, 10:14
si.. in parole povere.. il mio è un filtro di source directshow.. il thread serve per riempire un buffer di 4 secondi di filmato..mentre il filtro deve continuare a inviare i fotogrammi che sono presenti in quantità nel buffer..

ma ciò non avviene.. se la readFIle ci mette 400 millisecondi a leggere per quel periodo tutto il filtro (ovviamente su un thread a parte) è fermo.. tutto ciò senza lock, mutex, semafori o quant'altro..

Stoicenko
25-09-2009, 10:35
aggiornamento: ho scovato nel codice, che ogni tot frames, aprivo un nuovo handle per aggiornare la durata del file..

ora, non riesco a capire come le due cose siano dipendenti, ma eliminando la routine il problema sparisce..

mi viene da pensare che se si usa la createfile su un file in uso da un'altro thread (anche se con handle diversi) la createFile si "fermi"..

ma mi sembra totalmente illogico

Loading