Ist es möglich, das C ++ 11-Mutex-Konzept für std :: condition_variable zu implementieren?

8

Ich finde, dass die std::mutex Implementierung in Visual Studio 2013 zu langsam ist. Es verwendet einen schwergewichtigen Mutex, um sicherzustellen, dass Synchronisation auch zwischen Prozessen erreicht werden kann, was alles gut und gut ist; Es sei denn, Sie sprechen nicht mit anderen Prozessen und könnten diese zusätzliche Geschwindigkeit, die CRITICAL_SECTION mit ihren Spin-Lock-Funktionen auf Win32 bietet, wirklich nutzen.

Ich habe versucht, ein fast_recursive_mutex zu implementieren, das dem C ++ 11 Mutex-Konzept entspricht und alle Verpflichtungen laut Spezifikation erfüllt. In jedem Fall ist es ein Ersatz für std::mutex , solange Sie nicht zwischen Prozessen synchronisieren.

Es funktioniert großartig mit std::lock_guard und std::unique_lock . Allerdings habe ich Probleme mit std::condition_variable , weil std::condition_variable::wait(std::unique_lock<std::mutex>&) wegen der hartcodierten Verwendung von fast_recursive_mutex meine std::mutex nicht zulässt.

Meine Fragen sind also:

  1. Warum lässt wait() keinen anderen Mutex-Typ zu als std::mutex ?
  2. Kann ich etwas dagegen tun? (Kurze Zeit, um condition_variable erneut zu implementieren.)
Emily L. 02.09.2014, 10:28
quelle

2 Antworten

6

Sie können std::condition_variable_any für einen abschließbaren Typ verwenden .

    
Piotr Skotnicki 02.09.2014, 10:30
quelle
0

Ich glaube, std::mutex Implementierung in Visual Studio 2012/2013 verwendet bereits kritische Abschnitte. Überprüfen Sie einfach VSDIR\VC\crt\thr\mutex.c

Sie können dies auch empirisch überprüfen, indem Sie die std::mutex::native_handle() -Methode verwenden und das, was zurückgegeben wird, in CRITICAL_SECTION umsetzen.

    
kozmo 02.09.2014 15:01
quelle