Condividi tramite


IDirectWriterLock - Implementazione di file composti

L'implementazione composta di file di IDirectWriterLock consente di aprire un file composto in modalità diretta con un singolo writer e più lettori.

I file composti possono essere aperti in modalità diretta usando il flag di STGM_DIRECT. L'interfaccia IDirectWriterLock imposta il STGM_READWRITE| STGM_SHARE_DENY_WRITE flag come valido in modalità diretta senza richiedere il sovraccarico di una copia snapshot.

Quando un file composto viene aperto in modalità transazionata usando il flag di STGM_TRANSACTED, è anche possibile avere più lettori e un singolo writer usando il STGM_READWRITE| STGM_SHARE_DENY_WRITE flag. Tuttavia, in questo caso, viene eseguita una copia snapshot del file per i lettori. Spesso si verifica un sovraccarico di una copia da zero.

Utilizzo

Usare l'implementazione fornita dal sistema di IDirectWriterLock quando si apre una risorsa di archiviazione in modalità diretta (STGM_DIRECT) con il STGM_READWRITE| STGM_SHARE_DENY_WRITE flag.

Per ottenere un puntatore a IDirectWriterLock, chiamare QueryInterface in IStorage per ottenere l'oggetto di archiviazione radice per il file composto.

Chiamare IDirectWriterLock::WaitForWriteAccess per ottenere l'accesso in scrittura esclusivo a un file composto. Chiamare IDirectWriterLock::ReleaseWriteAccess per rilasciare l'accesso in scrittura esclusivo.

IDirectWriterLock::HaveWriteAccess indica se il file è attualmente bloccato.

Commenti

L'implementazione composta dei file della funzionalità a scrittura singola e a più lettori è basata sul blocco dell'intervallo. Il writer ottiene l'accesso esclusivo all'archiviazione per la scrittura dopo che tutti i lettori correnti hanno chiuso l'archiviazione. Mentre il writer è attivo, i lettori successivi non possono aprire l'archiviazione. Il writer chiama IDirectWriterLock::WaitForWriteAccess per ottenere l'accesso in scrittura esclusivo. Il writer deve quindi chiamare IDirectWriterLock::ReleaseWriteAccess per rilasciare l'archiviazione.

La chiamata a IDirectWriterLock::WaitForWriteAccess è necessaria prima di scrivere in questa modalità a lettore singolo e a più writer. Tenta di scrivere nel file senza chiamare IDirectWriterLock::WaitForWriteAccess per primo risultato in STG_E_ACCESSDENIED. Questo errore viene restituito anche se il writer ha aperto inizialmente il file e non sono attualmente aperti i lettori.

Considerazioni sul marshalling

Il marshalling personalizzato viene in genere usato quando un file composto viene eseguito il marshalling in un altro processo nella stessa macchina. Quando si esegue il marshalling delle risorse di archiviazione, i diritti di accesso non vengono considerati e il puntatore IStorage viene passato al nuovo processo con le stesse modalità di accesso e diritti del processo di marshalling originale. Per altre informazioni sulle modalità di accesso, vedere Costanti STGM. Durante il marshalling, nessun blocco viene eseguito o verificato per garantire l'accesso in scrittura esclusivo. In questo caso, non esiste alcuna applicazione dei criteri di scrittura singolo per i file composti aperti nella modalità a scrittura singola e a più lettori. L'applicazione viene invece gestita internamente dall'implementazione del file composto.

Poiché il puntatore IStorage viene passato a un altro processo durante il marshalling, è possibile che due processi abbiano accesso simultaneo allo stesso file composto. Anche se un chiamante può avere ottenuto l'accesso in scrittura esclusivo all'archiviazione chiamando IDirectWriterLock::WaitForWriteAccess, la versione con marshalling può anche avere accesso simultaneamente. Le versioni con marshalling non vengono costrette a chiudere mentre il singolo writer accede al file. In questo caso, l'implementazione del file composto sincronizza le scritture internamente.

Se un singolo writer ottiene l'accesso esclusivo chiamando IDirectWriterLock::WaitForWriteAccess, l'archiviazione con marshalling dispone anche di accesso in scrittura e non deve chiamare IDirectWriterLock::WaitForWriteAccess. Entrambi i processi hanno accesso in scrittura e sincronizzazione sono controllati dall'implementazione interna del file composto.

IDirectWriterLock