2015-02-17 14 views
8

std :: mutex è implementato con sezioni critiche, motivo per cui è molto più veloce di OS Mutex (su Windows). Tuttavia non è veloce come un CRITICAL_SECTION di Windows.Perché std :: mutex due volte più lento di CRITICAL_SECTION

Tempi solo un loop stretto in un singolo thread:

423.76ns ATL CMutex 
41.74ns std::mutex 
16.61ns win32 Critical Section 

La mia domanda è che cosa è std :: mutex facendo? Ho guardato la fonte ma non ho potuto seguirla. Comunque ci sono stati dei passaggi extra prima che si rimettano alla Crit Sec. Le mie domande sono: questi passaggi extra sono utili? Cioè, quali sono i passaggi extra per; Cosa mi piacerebbe perdere usando CRITICAL_SECTION?

Anche perché lo chiamano Mutex se non è implementato con un Mutex?

+4

Che tempismo? Creare un mutex, bloccarlo, sbloccarlo, ...? Per quanto riguarda le differenze dal mutex Win32: un mutex Win32 è un mutex cross-process. Lo standard richiede solo un mutex cross-thread, che può essere un costrutto più leggero (e implementa Windows con una sezione critica). –

+1

CMutex è implementato con un mutex, non è economico. std :: mutex è costruito sopra Concurrency Runtime, è un bel pezzo di codice con funzionalità che si estendono in modo significativo oltre le primitive di schedatura e programmazione fornite dal sistema operativo. La stratificazione è pesante, non viene gratis. Se un critsect serve al tuo scopo e il sovraccarico in realtà conta solo azzeccare il problema e usarlo. –

+1

Stavo programmando solo il blocco/sblocco. Sono solo curioso di sapere cosa std :: mutex va oltre il crit sec. Se è utile, non dovrei volerlo? Se non è utile perché lo fa? Penso che userò std :: mutex ma mi chiedo solo cosa faccia in più. – Philip

risposta

3

Un std :: mutex fornisce semantica della proprietà non ricorsiva. A CRITICAL_SECTION fornisce semantica ricorsiva. Quindi presumo che il livello extra nell'implementazione std :: mutex sia (almeno in parte) per risolvere questa differenza.

Aggiornamento: passando attraverso il codice, sembra che std :: mutex sia implementato in termini di una coda e istruzioni InterlockedX piuttosto che un classico CRITICAL_SECTION Win32. Anche se std :: mutex non è ricorsivo, il codice sottostante in RTL può facoltativamente gestire i blocchi ricorsivi e anche a tempo.

+0

Sembra plausibile, tranne che std :: recusive_mutex non è più veloce tha std :: mutex nei miei test. Il che suggerisce che stanno entrambi facendo qualcosa per rallentarli, il che è ortogonale al fatto che siano ricorsivi o meno, giusto? – Philip

+4

Dato che UB tenta di bloccare in modo ricorsivo un 'std :: mutex', non vedo perché il codice sarebbe necessario per" risolvere la differenza ". –

+0

Forse è il codice di debug per rilevare l'UB? I tempi sono stati eseguiti usando il rilascio o il debug? –