2010-07-22 2 views
12

Scheint, dass Boosts shared_mutex nicht rekursiv ist. Gibt es das überhaupt? (ohne das ganze Zeug zu implementieren)BOOST: rekursiv shared_mutex?

+7

Bevor Sie diesen Weg gehen, sollten Sie lesen, was [andere denken] (http://www.zaval.org/resources/library/butenhof1.html) über rekursive Mutexe. –

+1

haben Sie sich Boost angesehen: rekursive_mutex? –

+1

Ja, aber es wird nicht geteilt – GabiMe

Antwort

-3

Sie müssen shared_ptr in diesen Fällen verwenden. Setzen Sie Ihren Mutex in ein shared_ptr und es wird Ref-Zählen auf Ihrem Mutex, die Ihnen ähnliche Ergebnisse gab.

+0

Wie ist ein boost :: weak_ptr zu einem boost :: shared_mutex? –

+0

@Sam Entschuldigung, ich dachte an etwas und schrieb ein ganz anderes. Ich habe meinen Beitrag bearbeitet, um ihn klarer/richtig zu machen. – Gianni

+3

'shared_ptr' hat nichts mit der Frage zu tun. Die Frage besteht nicht darin, ein physisches Objekt zu teilen (was 'shared_ptr' zulässt), sondern auf die gemeinsame und resurtive Eigentümerschaft der Sperre (ein Synchronisationskonzept anstelle eines C++ - Objekts). –

0

boost :: rekursiver Mutex ist exklusiv. Ich denke, Sie müssen shared_mutex erweitern. Sie können die aktuelle Thread-ID in einem Satz behalten und prüfen, ob sie in dem Satz in der Funktion, die die Sperre bereitstellt, existiert.

0

Ich bin persönlich schon einmal hier gewesen. Die einfache Antwort ist nein, es gibt keine shared_recursive_mutex.

Ich bin nicht wirklich einverstanden mit dem, was andere Ihnen darüber erzählen, wie rekursive Mutexe im Allgemeinen eine schlechte Idee sind, es kann sicherlich einige Zeit sparen und einige Fehler verhindern. Wenn Sie jedoch nicht Ihr eigenes shared_recursive_mutex implementieren möchten, müssen Sie nicht-rekursive Mutexe verwenden. Es ist nicht so schlecht.

7

Werfen Sie einen Blick auf this thread und diese excellent explanation warum shared_mutex ist eine schlechte Idee im Allgemeinen. Wenn Sie also nicht zustimmen, dass recursive_mutex auch eine schlechte Idee ist, verwenden Sie es einfach ohne shariness, weil es Ihnen keinen Leistungsschub geben kann. Sie erhalten sogar einen etwas saubereren Code ohne größere Änderungen.

Ich habe versucht, shared_mutex in meinem Projekt zu verwenden, um stark umkämpfte Karten zu sperren, wenn viele Threads häufig Daten lesen und selten ändern. erhalten ein bisschen schlechtere Leistung Ergebnisse

+0

Ja. sehr interessante Analyse in der Tat. Vielen Dank! – GabiMe

1

Ich stimme teilweise mit Andy, dass shared_mutex eine schlechte Idee ist, weil es auf Ihr Design abhängt, d. h. wie verwenden Sie es in Ihrem Programm. Ich glaube, dass wenn Sie lange Lesevorgänge mit geteilten Mutex machen, kann es Ihnen eine effizientere Leistung bringen, als wenn Sie einfache Mutex für kurze häufigere Sperren zum Lesen mit seltenen Schriften verwendet hätten. So ist shared_mutex eine Möglichkeit, etwas gleichzeitig lange zu tun. Und ich glaube nicht, dass ein langes Schloss in diesem Fall ein schlechtes Design ist.

Unterstützen Sie mich oder ich liege falsch?