Warum ist std :: mutex doppelt so langsam wie CRITICAL_SECTION?

8

std :: mutex ist mit kritischen Abschnitten implementiert, weshalb es viel schneller ist als OS Mutex (unter Windows). Es ist jedoch nicht so schnell wie ein Windows-CRITICAL_SECTION.

Timings sind nur eine enge Schleife in einem einzelnen Thread:

%Vor%

Meine Frage ist, was sonst noch std :: mutex macht? Ich schaute auf die Quelle, konnte ihr aber nicht folgen. Es gab jedoch zusätzliche Schritte, bevor es sich auf den Crit Sec verlagerte. Meine Fragen sind: Sind diese zusätzlichen Schritte nützlich? Das sind die zusätzlichen Schritte für; was würde ich mit CRITICAL_SECTION verpassen?

Warum haben sie es auch Mutex genannt, wenn es nicht mit einem Mutex implementiert ist?

    
Philip 17.02.2015, 16:02
quelle

1 Antwort

3

Ein std :: mutex bietet nicht-rekursive Eigentumsrechte-Semantik. Ein CRITICAL_SECTION liefert rekursive Semantik. Daher nehme ich an, dass die zusätzliche Ebene in der std :: mutex-Implementierung (zumindest teilweise) diesen Unterschied auflöst.

Update: Durch das Durchlaufen des Codes sieht es so aus, dass std :: mutex in Form einer Queue und InterlockedX-Anweisungen anstelle eines klassischen Win32 CRITICAL_SECTION implementiert wird. Obwohl std :: mutex nicht-rekursiv ist, kann der zugrunde liegende Code in der RTL optional rekursive und sogar zeitgesteuerte Sperren verarbeiten.

    
Adrian McCarthy 17.02.2015, 19:02
quelle