Sembra che shared_mutex di Boost non sia ricorsivo .. Esiste comunque intorno a questo? (senza riutilizzare l'intera roba)BOOST: ricorsivo shared_mutex?
risposta
In questi casi sarà necessario utilizzare shared_ptr. Metti il tuo mutex in un shared_ptr e farà il ref-counting sul tuo mutex, che ti darà risultati simili.
come è un boost :: weak_ptr relativo a un boost :: shared_mutex? –
@Sam dispiace, ho pensato a qualcosa e ne ho scritto un altro interamente. Ho modificato il mio post per renderlo più chiaro/corretto. – Gianni
'shared_ptr' non ha nulla a che fare con la domanda. La domanda non riguarda la condivisione di oggetti fisici (consentiti da 'shared_ptr') ma la proprietà condivisa e ricorsiva del blocco (un concetto di sincronizzazione piuttosto che un oggetto C++). –
boost :: mutex ricorsivo è esclusivo. Penso che dovrai estendere shared_mutex. È possibile mantenere l'ID filo corrente in un set e verificare se esiste nella serratura della funzione set in.
Sono stato su questa strada personalmente prima. La risposta semplice è no, non esiste shared_recursive_mutex.
Non sono davvero d'accordo con quello che gli altri ti diranno su come i mutex ricorsivi sono generalmente una cattiva idea, sicuramente può risparmiare un po 'di tempo e prevenire alcuni errori. Tuttavia, se non si desidera implementare il proprio shared_recursive_mutex, è necessario attenersi ai mutex non ricorsivi. Non è così male.
dare un'occhiata a this thread e questo excellent explanation perché shared_mutex
è una cattiva idea in generale. quindi se non sei d'accordo che lo recursive_mutex
è una cattiva idea, basta usarlo senza qualsiasi squisitazza perché non può darti alcun incremento di prestazioni. riceverai anche un codice un po 'più pulito senza cambiamenti importanti.
Ho provato a utilizzare shared_mutex nel mio progetto per bloccare la mappa altamente contestata quando molti thread spesso leggono i dati e raramente li modificano. risultati leggermente peggiori delle prestazioni
Sì. analisi davvero interessante. Grazie! – GabiMe
Sono parzialmente in disaccordo con Andy che shared_mutex è una cattiva idea perché dipende dal tuo design, cioè come lo si utilizza nel programma. Credo che se fai letture frequenti a lungo con mutex condiviso, puoi ottenere prestazioni più efficienti rispetto a quelle che avresti usato per il mutex semplice per i lucchetti più frequenti per la lettura con scritti rari. Quindi shared_mutex è un modo per fare qualcosa a lungo contemporaneamente. E non credo che un blocco lungo sia un cattivo design in questo caso.
Mi sostieni o sbaglio?
- 1. Boost shared_lock. Leggere preferito?
- 2. std :: mappa di boost :: mutex con strani comportamenti
- 3. Elenco ricorsivo di LINK_LIBRARIES in CMake
- 4. C++ mpl ricorsivo: uguale problema?
- 5. ricorsivo Fibonacci
- 6. cefalea ricorsivo
- 7. boost :: tokenizer vs boost :: split
- 8. Can thread che tenta di std :: lock [_unique] uno std :: shared_mutex essere affamato dai thread che chiamano std :: lock_shared?
- 9. TreeView ricorsivo in ASP.NET
- 10. Stream ricorsivo genera StackOverflowError
- 11. knockout.js binding ricorsivo
- 12. ricorsivo specifica noexcept
- 13. ricorsivo template metaprogrammazione
- 14. ricorsivo selezionare in MySQL
- 15. ricorsivo Loop XSLT
- 16. mkdir ricorsivo() e chmod()?
- 17. Complessità spaziale dell'algoritmo ricorsivo
- 18. SVN: Aggiungi ricorsivo
- 19. Sovraccarico di lambda ricorsivo
- 20. Script Mogrify ricorsivo
- 21. XML ricorsivo a Scala
- 22. MySQL ricorsivo seleziona?
- 23. ricorsivo interrogazione auto
- 24. Può essere chiamato ricorsivo?
- 25. Starteam Ricorsivo Aggiungi
- 26. KnockoutJS e modello ricorsivo
- 27. Fibonacci serie - sommatoria ricorsivo
- 28. Associazione modello ricorsivo polimerico
- 29. Os.walk non ricorsivo()
- 30. ricorsivo (doall) in clojure
Prima di percorrere questo percorso, potresti voler leggere cosa [altri pensano] (http://www.zaval.org/resources/library/butenhof1.html) sui mutex ricorsivi. –
hai guardato boost: recursive_mutex? –
Sì ma non è condiviso – GabiMe