012
03.05.2006, 15:43 Uhr
0xdeadbeef
Gott (Operator)
|
Also, das böse an globalen Variablen ist folgendes: Keine Threadsicherheit.
Gerade, wenn man eine Bibliothek entwickelt, von der man nicht weiß, wofür sie nachher benutzt werden soll, ist das - aus ziemlich offensichtlichen Gründen - von entscheidender Bedeutung. Nichts spricht gegen globale Konstanten, aber bei globalen Variablen bekommt man Synchronisationsprobleme und muss dementsprechend recht umständlich mutexen, was wieder Laufzeit kostet.
In aller Regel sollte man sein Programm deshalb so designen, dass die Frage nach globalen Variablen sich überhaupt nicht stellt. Lässt es sich nicht vermeiden, handelt es sich mit 99,9%iger Wahrscheinlichkeit (mir fällt gerade kein Fall ein, in dem es nicht so ist) um die Abstraktion einer tatsächlich globalen Ressource, z.B. eines Laufwerkes, und da kommt man ums mutexen eh nicht herum. Ist es in der Designphase einfach nicht bedacht worden, muss man sich mit mehr oder weniger ekligen hacks helfen und den ganzen Kram beizeiten von Grund auf neu schreiben - ich hege den Verdacht, dass es sich in diesem Fall um ein solches Problem handelt. Die wohl gängigste Methode - weil am einfachsten zu implementieren - ist wohl, die globalen Variablen in einem struct zu deklarieren und allen Funktionen einen Parameter des Typs struct global_vars * an die Parameterliste anzuhängen, in dem dann ein pointer auf ein vorher befülltes struct übergeben wird. Allerdings - dreckig ist das schon. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |