Macro KeAcquireSpinLock (wdm.h)
La routine KeAcquireSpinLock acquisisce un blocco spin in modo che il chiamante possa sincronizzare l'accesso ai dati condivisi in modo sicuro tramite la generazione di IRQL.
Sintassi
void KeAcquireSpinLock(
SpinLock,
OldIrql
);
Parametri
SpinLock
Puntatore a un blocco di selezione KSPIN_LOCK inizializzato per il quale il chiamante fornisce l'archiviazione.
OldIrql
Puntatore a una variabile KIRQL impostata sull'IRQL corrente quando si verifica questa chiamata.
Valore restituito
nessuno
Osservazioni
KeAcquireSpinLock reimposta prima il runtime di integrazione su DISPATCH_LEVEL e quindi acquisisce il blocco. Il runtime di integrazione precedente viene scritto in OldIrql dopo l'acquisizione del blocco.
Il valore OldIrql deve essere specificato quando il blocco spin viene rilasciato con KeReleaseSpinLock.
La maggior parte dei driver usa una variabile locale per archiviare il valore IRQL precedente. Un driver può anche usare un percorso di memoria condivisa, ad esempio una variabile globale, ma il driver non deve usare la stessa posizione per due blocchi diversi. In caso contrario, può verificarsi una race condition.
I blocchi di rotazione possono causare gravi problemi se non usati in modo giudizio. In particolare, non viene eseguita alcuna protezione deadlock e l'invio è disabilitato mentre viene mantenuto il blocco di rotazione. Di conseguenza:
- Il codice all'interno di un'area critica protetta da un blocco di rotazione non deve essere paging né fare riferimenti a dati di paging.
- Il codice all'interno di un'area critica sorvegliata da un blocco spin non può chiamare alcuna funzione esterna che possa accedere a dati visualizzabili o generare un'eccezione, né generare eccezioni.
- Il chiamante deve rilasciare il blocco spin con KeReleaseSpinLock il più rapidamente possibile.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Disponibile a partire da Windows 2000. |
Piattaforma di destinazione | Universale |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Libreria | Hal.lib |
IRQL | <= DISPATCH_LEVEL |
Regole di conformità DDI | HwStorPortProhibitedDDDIs(storport), IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendWhileSpinlock(kmdf), Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm), SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm) |