2017-07-05 3 views
5

Ich habe die meisten Beispiele mit std::mutex gesehen, wo der Mutex global ist. Ich frage mich, gibt es einen bestimmten Grund, warum das getan wird? Ich habe eigene Programme, wo ich das nicht mache, und gebe einfach den Mutex als std::threadstd::ref weiter. Ist es nicht schlecht, global zu sein, was ist der Grund für die globale std::mutexes in C++, wenn es keinen sprachbeschränkenden Grund dafür gibt?Gibt es einen Grund, warum C++ 11+ Std :: Mutex als globale Variable deklariert werden sollte anstatt in einen std :: thread als Funktionsparameter übergeben zu werden?

+8

Kein Grund. Es wurde wahrscheinlich getan, um Code in dem Beispiel zu reduzieren. – NathanOliver

+0

Wahrscheinlich, weil der Autor die Syntax von 'std :: reference_wrapper' hasst;) –

+1

Es hängt völlig davon ab. Sind das eher triviale Programme? Besteht sie aus mehr als einer Datei? Benötigen Sie weitere Informationen. Normalerweise gelten Globals als schlechte Praktiken und sollten vermieden werden. Normalerweise sind meine Mutexe Klassenvariablen. Es ist oft natürlich, sie in das Objekt zu legen, das gesperrt werden muss. – Galik

Antwort

4

Es ist eine schlechte Praxis, Globals zu haben, außer wenn es nicht ist. Zum Beispiel ist std::cin global.

Mutexe sind in gewisser Weise global, unabhängig davon, wie Sie sie verfügbar machen. Sie werden zwischen verschiedenen Codeteilen geteilt. Sie können sie also zu Globalen machen oder Sie können sie durch Funktionen, die sie nicht verwenden, durch die Anrufkette leiten, bis Sie schließlich jemanden erreichen, der dies tut. Das ist bekannt als "Tramp Daten" und es ist auch "schlechte Praxis". Wähle dein Gift.

+0

Randnotiz: Sie können zumindest die Anzahl der Landstreicher minimieren, indem Sie die verschiedenen Daten (Mutexe usw.) zusammen in ein einzelnes Objekt einfügen; dann müssen Sie nur einen Argument in die Anrufkette hinunterreichen, anstatt viele. –

+0

@ JeremyFriesner - Ja, Sie können inkohärente Typen erstellen, um die Implementierung eines schlechten Designs zu vereinfachen. Im Ernst, das kann eine legitime Technik sein. Danke, dass du es erwähnt hast. –

+0

Einige Leute haben Kritik an globalen in '' ... Es ist nicht, weil es so in 'std' gemacht wird, dass es der richtige Weg ist. – Jarod42

0

Am wahrscheinlichsten wurde dies getan, um das Beispiel einfacher zu machen, wobei die Verwendung des Mutex selbst im Mittelpunkt des Beispiels steht und nicht die genauen Einzelheiten.

Normalerweise schützt ein Mutex eine Ressource und in vielen Fällen macht es Sinn, dass der Mutex neben der Ressource lebt. Wenn Sie beispielsweise eine Klasse mit einem Mitgliedscontainer haben, der durch einen Mutex geschützt werden muss, machen Sie den Mutex auch zu einem Mitglied der Klasse. Da die Klasseninstanz von mehreren Threads bearbeitet wird, kann der Member-Mutex verwendet werden, um die erforderlichen Zugriffe auf den internen Container zu schützen.

Verwandte Themen