2013-09-05 19 views
5

Ho appena appreso della classe interbloccata e che dovrebbe essere più veloce del semplice blocco. Ora, questo è tutto bello e buono, ma sono curioso di implementazione.Come funziona Interlocked e perché è più veloce della serratura?

Per quanto ne so, l'unico modo per garantire che un'operazione su una variabile sia eseguita in modo atomico è garantire che solo un thread possa accedere a tale variabile in qualsiasi momento. Che sta bloccando

ho usato riflettore per ottenere la fonte di Interlocked, ma sembra che si utilizza il metodo esterno a fare tutto il suo lavoro:

[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
internal static extern int ExchangeAdd(ref int location1, int value); 

Ho eseguito alcuni test, e prese in effetti è il doppio veloce come semplicemente bloccare l'oggetto e incrementarlo.

Come stanno facendo?

+1

Supporto CPU .... – spender

+0

cosa intendi? –

risposta

8

Interbloccato ha il supporto a livello della CPU, che può eseguire direttamente l'operazione atomica.

Ad esempio, Interlocked.Increment è effettivamente una XADD, e confrontare e scambiare (cioè: Interlocked.CompareExchange) è supportato tramite il CMPXCHG instructions (entrambi con un prefisso LOCK).

+0

la cosa divertente è - ho appena eseguito un test Interlocked vs ++. Interlocked sembra più veloce –

+0

@ArsenZahray Come stai benchmark? Se lo fai nel debug o sotto l'host di test VS, il tuo benchmark sarà fortemente distorto. –

+0

Eseguo ogni operazione 100000000 volte. E ho appena eseguito il mio programma dal cmd, e il risultato non è cambiato (blocco: 00: 00: 02.4291389, interbloccato: 00: 00: 01.1740671; ++: 00: 00: 01.4320819 –