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::thread
std::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?
Antwort
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.
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. –
@ JeremyFriesner - Ja, Sie können inkohärente Typen erstellen, um die Implementierung eines schlechten Designs zu vereinfachen.
Einige Leute haben Kritik an globalen in '
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.
- 1. C++ 11 Können nur primitive Datentypen als atomar deklariert werden?
- 2. std :: unique_ptr als Parameter in std :: thread
- 3. Warum ist std :: mutex schneller als std :: atomic?
- 4. std :: ostream als optionaler (!) Funktionsparameter
- 5. std :: condition_variable warum benötigt es ein std :: mutex
- 6. Gibt es einen Grund, C++ 11 std :: int_fast32_t oder std :: int_fast16_t über int in plattformübergreifendem Code zu verwenden?
- 7. Erstellt std :: mutex einen Zaun?
- 8. Warum muss eine Variable als globale Variable deklariert werden, bevor sie zugewiesen wird?
- 9. Std :: Mutex nicht ordnungsgemäß für Std :: Cout
- 10. AngularJS übergeben einen Scope Variablennamen als Funktionsparameter
- 11. Gibt es einen Grund, find_if, for_each, count etc. keine std ::?
- 12. Passign Code als Funktionsparameter, anstatt einen Callback zu deklarieren
- 13. Gibt es einen Grund, warum es nicht std :: identity in der Standardbibliothek gibt?
- 14. C++ 11 Std :: einen Zeiger weiterleiten
- 15. Warum gibt es einen Unterschied im Aufruf von Konstruktoren, wenn sie als Wert an eine Funktion übergeben werden und als Wert an einen anderen Konstruktor übergeben werden?
- 16. Threading einer Member-Funktion mit einem std :: Mutex als Argument
- 17. Globale Konstante in C++ 11 in std :: array verwendet
- 18. C++ 11 std :: condition_variable: Können wir unsere Sperre direkt an den notifizierten Thread übergeben?
- 19. C++ 11 Variable
- 20. Warum werden std :: stoi und std :: array nicht mit g ++ C++ 11 kompiliert?
- 21. Problem mit Std :: Thread aus C++ 11
- 22. Warum std :: map find() wird nicht als noexcept deklariert?
- 23. Gibt es irgendwelche Gründe, warum C++ Vorlagenpakete mit std :: tuple übergeben werden
- 24. Verwendung std :: Funktion als Delegierter in C++ 11
- 25. XCode std :: thread C++
- 26. Gibt es einen "Null" -Wert für std :: thread :: id?
- 27. Wann sollte std :: atomic_compare_exchange_strong verwendet werden?
- 28. Können std :: condition_variables als Zähl-Semaphore verwendet werden?
- 29. Ist die Synchronisation mit `std :: mutex` langsamer als mit` std :: atomic (memory_order_seq_cst) `?
- 30. Ist es möglich, einen leeren std :: vector als Standardparameter anzugeben?
Kein Grund. Es wurde wahrscheinlich getan, um Code in dem Beispiel zu reduzieren. – NathanOliver
Wahrscheinlich, weil der Autor die Syntax von 'std :: reference_wrapper' hasst;) –
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