In ambiente Windows, il mutex con scope di Boost utilizza le sezioni critiche di WinAPI o qualcos'altro?C'è differenza tra il mutex scope di Boost e la sezione critica di WinAPi?
risposta
La versione corrente di boost::mutex
non utilizza né Win32 CRITICAL_SECTION
né Win32 Mutex. Invece, utilizza le operazioni atomiche e un evento Win32 per bloccare le attese.
Versioni precedenti (boost 1.34.1 e precedenti) erano un involucro intorno a CRITICAL_SECTION
su Windows.
Per inciso, il mutex stesso non ha ambito. Il tipo boost::mutex::scoped_lock
e, nelle versioni recenti, boost::lock_guard<boost::mutex>
e boost::unique_lock<boost::mutex>
forniscono wrapper RAII per il blocco di un mutex per garantire che non si dimentichi di sbloccarlo.
I boost::lock_guard<>
e boost::unique_lock<>
modelli funzionano con qualsiasi tipo con lock()
e unlock()
funzioni membro, in modo da poterli utilizzare con mutex inter-processo se lo si desidera.
Grazie per la risposta. – nhaa123
Probabilmente è quasi/efficiente quanto una sezione critica di Win32? – unixman83
@ unixman83: ne dubito, una sezione critica è veloce perché è solo in-process, non è possibile utilizzarla tra i processi. Non è un oggetto kernel, ma gli eventi Win32 lo sono. Quindi suppongo che questo non sia veloce come un CS. – gbjbaanb
CRITICAL_SECTION di Win32 può essere utilizzato solo tra i thread di un singolo processo. Se è necessario utilizzare qualcosa tra i processi, è necessario un mutex. Boost non dice nulla sulle sezioni critiche, quindi suppongo che stia usando i mutex.
"ambito" significa solo che ha un wrapper che utilizza RAII per sbloccare automaticamente il mutex alla fine di un particolare ambito.
Non hai dato un'occhiata al codice sorgente Boost, vero? :) – OregonGhost
Sono in una posizione in cui non posso accedervi :( – nhaa123
È necessario l'accesso a Internet per entrambe le fonti Stack Overflow e Boost. Http://svn.boost.org/svn/boost/trunk/ – ognian