2010-07-22 14 views
12

Sembra che shared_mutex di Boost non sia ricorsivo .. Esiste comunque intorno a questo? (senza riutilizzare l'intera roba)BOOST: ricorsivo shared_mutex?

+7

Prima di percorrere questo percorso, potresti voler leggere cosa [altri pensano] (http://www.zaval.org/resources/library/butenhof1.html) sui mutex ricorsivi. –

+1

hai guardato boost: recursive_mutex? –

+1

Sì ma non è condiviso – GabiMe

risposta

-3

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.

+0

come è un boost :: weak_ptr relativo a un boost :: shared_mutex? –

+0

@Sam dispiace, ho pensato a qualcosa e ne ho scritto un altro interamente. Ho modificato il mio post per renderlo più chiaro/corretto. – Gianni

+3

'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++). –

0

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.

0

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.

7

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

+0

Sì. analisi davvero interessante. Grazie! – GabiMe

1

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?