Moinsen allseits. Der Titel sagt eigentlich schon alles, aber hier nochmal mit erklärung:
Es geht darum, die Compileroptimierungen für einen bestimmten codebereich zu deaktivieren. Insbesorndere habe ich eine Stelle in einem Programm in dem 50sec gewartet werden muss. dort habe ich es per schleife gelöst, dass alle 5 sec eine meldung ausgegeben wird, wie lange noch zu warten ist:
for(ct=0;ct<10;ct++)
{
printf("Noch %d sekunden.\n",50-(ct*5));
sleep(5);
}
Der Compiler "optimiert" an dieser stelle alles so zusammen, dass 50 sec gewartet wird, und dann alle printf-meldungen ausgegeben werden. Da ich an anderer stelle auf diese optimierungen angewiesen bin, möchte ich selbige aber nur teilweise anwenden. Btw, Compiler ist der gcc-4.3
Noch eine 2. Frage: Mir ist aufgefallen, dass C bei funktionsaufrufen immer den selben datenbereich verwendet. sprich, habe ich eine funktion, in der eine Variable definiert wird, so ist diese beim nächsten aufruf der Funktion noch gesetzt. Wenn ich (p)Threads verwende, wird dann für jeden Thread ein neuer Datenbereich angelegt? oder muss ich hier zwangsläufig mit dynamischer Speicherzuweisung arbeiten?
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Zur 2. Frage:
(Nichtstatische) Variablen, die innerhalb einer Funktion definiert werden, werden auf dem Stack abgelegt. Damit sind ja dann auch rekursive Aufrufe möglich, ohne dass sich die einzelnen Instanzen in die Quere kommen.
> Mir ist aufgefallen, dass C bei funktionsaufrufen immer den selben datenbereich verwendet. sprich, habe ich eine funktion, in der eine Variable definiert wird, so ist diese beim nächsten aufruf der Funktion noch gesetzt.
Lokale Variablen werden in C bei ihrer Deklaration (ohne Zuweisung) nicht vorbelegt.
Wenn der Stack nicht überschrieben wurde, z.B. durch den zwischenzeitlichen Aufruf einer zweiten Fkt., so sind darauf noch die alten Werte. Dies aber in irgendeiner Weise im Prg. als sicher anzunehmen ist selbstredend ein No-Go...
Obwohl ich erst einmal (vor längerer Zeit) was mit Multi-Threads gemacht habe, bin ich mir sicher, dass jede Funktionsinstanz einen separaten Datenbereich (analog zu rekursiven Funktionsaufrufen) erhält. Das Problem bei parallel ablaufenden Funktionen ist immer der Zugriff auf globale - und in einer Funktion definierte statische Variablen werden auch wie solche gehandhabt - Daten.
Gruß,
Mdl
jetzed wo dus sagst springts mich an. trotzdem thx für die erläuterung.
Btw, o.g. situation ist mir ja auch nur aufgefallen, weil ich bei einem kleinen test eines programms schlampig war und vergessen hatte die variable beim beginn der funktion entsprechend zu initialisieren.
Das mit den globalen variablen und multithreading sollte man sich übrigens ganz abgewöhnen(allgemein globals...) Dafür kann man dem thread ja parameter übergeben, bzw die threads synchronisieren.