2014-09-02 12 views
8

Trovo che l'implementazione std::mutex in Visual Studio 2013 sia troppo lenta. Usa un mutex pesante per assicurare che la sincronizzazione possa essere raggiunta anche tra i processi che sono eccellenti e dandy; A meno che tu non stia parlando con altri processi e potresti davvero usare quella velocità extra che è CRITICAL_SECTION con le sue offerte spin-lock su Win32.È possibile implementare il concetto mutex di C++ 11 per l'uso da std :: condition_variable?

Ho provato a implementare un fast_recursive_mutex che aderisce al concetto mutex C++ 11 e che soddisfa tutti gli obblighi in base alle specifiche. In tutti i sensi, è una sostituzione drop-in per std::mutex finché non si esegue la sincronizzazione tra i processi.

Funziona alla grande con std::lock_guard e std::unique_lock. Tuttavia, si verificano problemi durante il tentativo di utilizzo con std::condition_variable perché std::condition_variable::wait(std::unique_lock<std::mutex>&) non ammette il mio fast_recursive_mutex a causa dell'uso codificato di std::mutex.

Quindi le mie domande sono:

  1. Perché wait() non ammette un altro tipo di mutex std::mutex?
  2. C'è qualcosa che posso fare al riguardo? (A corto di re-implementation condition_variable).
+0

La prima domanda di "perché non ammette un altro tipo", si potrebbe anche chiedere perché hanno scritto due diverse classi 'condition_variable' e non hanno semplicemente un tipo con un tipo mutex con modello. – CashCow

risposta

6

È possibile utilizzare std::condition_variable_any per qualsiasi tipo di serratura .

+0

Hai qualche idea riguardo la prima domanda? – anderas

+1

@anderas: http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-dariable –

+2

Non posso credere di essermi perso questo aspetto quando ho guardato i riferimenti e quando googlando ... Grazie! –

0

Credo che l'implementazione di std::mutex in Visual Studio 2012/2013 utilizzi già sezioni critiche. Basta controllare VSDIR\VC\crt\thr\mutex.c

È inoltre possibile controllare empiricamente questo std::mutex::native_handle() metodo che utilizza e gettato ciò che è tornato a CRITICAL_SECTION.

+1

Molte persone hanno misurato questo: http://stackoverflow.com/a/18092273/2498188 e http://stackoverflow.com/a/24470878/2498188 qui per esempio. Le mie misurazioni coincidono con queste .. –

+0

Il mio punto era VS non usa letteralmente mutex ipc di grosso peso ma piuttosto 'Concurrency :: critical_section' che in qualche modo (controlla' critical_section :: _ Acquire_lock() 'in VC \ crt \ src \ rtlocks.cpp) è più lento di due volte rispetto a 'CRITICAL_SECTION'. – kozmo