Forum: PC-Programmierung Wie war das noch mit volatile in C ?


von Stefan (Gast)


Lesenswert?

glib-2.43.90/gobject/gobject.c
1
/**
2
 * g_clear_object: (skip)
3
 * @object_ptr: a pointer to a #GObject reference
4
 *
5
 * Clears a reference to a #GObject.
6
 *
7
 * @object_ptr must not be %NULL.
8
 *
9
 * If the reference is %NULL then this function does nothing.
10
 * Otherwise, the reference count of the object is decreased and the
11
 * pointer is set to %NULL.
12
 *
13
 * A macro is also included that allows this function to be used without
14
 * pointer casts.
15
 *
16
 * Since: 2.28
17
 **/
18
#undef g_clear_object
19
void
20
g_clear_object (volatile GObject **object_ptr)
21
{
22
  g_clear_pointer (object_ptr, g_object_unref);
23
}

Mir fällt gerade nicht ein, warum hier volatile bei dem Parameter 
verwendet wird. An volatile im Zusammenhang mit ISR erinnere ich mich 
schon, aber diese Funktion wird ja nicht vom Interrupt aufgerufen. Aber 
was soll's, eine dumme Frage mehr, und ich muss jetzt eh weg.

von Clemens L. (c_l)


Lesenswert?

Es ist möglich, sich sein eigenes GObject(-abgeleitetes)-Objekt mit 
volatile zu definieren (z.B. weil es auch im ISR benutzt wird).
Ohne das volatile würde dann der Compiler beim Aufruf von 
g_clear_object() meckern.

von Programmierer (Gast)


Lesenswert?

Kein Mensch verwendet aber die glib ohne Betriebssystem, also so dass 
man was mit Interrupts machen müsste. volatile hat nichts mit Interrupts 
zu tun, sondern mit Compiler Optimierungen. Und das kann bei 
Multithreading relevant sein. Allerdings bin ich mir nicht sicher dass 
man volatile da überhaupt korrekt anwenden kann, und man das nicht mit 
locks/atomics machen muss...

von Peter II (Gast)


Lesenswert?

Programmierer schrieb:
> Allerdings bin ich mir nicht sicher dass
> man volatile da überhaupt korrekt anwenden kann, und man das nicht mit
> locks/atomics machen muss

eigentlich muss man beides machen. Nur ein PC hat meist recht wenig 
Register so das die Daten aus dem Ram kommen und nicht im Register 
verweilen. Damit reicht es oft aus ohne volatile zu arbeiten.

von Robert L. (lrlr)


Lesenswert?

http://blog.regehr.org/archives/28


habs zwar nicht gelesen, aber was soll's, eine dumme Antwort mehr, und 
ich muss jetzt eh weg.

von Kenner (Gast)


Lesenswert?


von Stefan S. (Gast)


Lesenswert?

Programmierer schrieb:
> volatile hat nichts mit Interrupts
> zu tun, sondern mit Compiler Optimierungen. Und das kann bei
> Multithreading relevant sein. Allerdings bin ich mir nicht sicher dass
> man volatile da überhaupt korrekt anwenden kann, und man das nicht mit
> locks/atomics machen muss...

Ja, an Multithreading hatte ich auch kurz gedacht, aber ohne konkrete 
Idee was das Problem sein könnte. Compiler Optimierungen ist auch ein 
gutes Stichwort, aber auch da wüsste ich nicht was konkret schiefgehen 
könnte.

Tatsächlich habe ich bei meiner Nim-Version von 
gtk+-3.18.1/examples/application10 mit dieser Funktion ein kleines 
Problemchen -- wenn ich aber das gleichnamige Macro verwende, geht es.

Das ist eh etwas komisch, in

glib-2.43.90/gobject/gobject.h

haben wir:
1
GLIB_AVAILABLE_IN_ALL
2
void    g_clear_object (volatile GObject **object_ptr);
3
#define g_clear_object(object_ptr) g_clear_pointer ((object_ptr), g_object_unref)

Wer also nicht explizit dieses Macro zurücksetzt, wird ja wohl stets das 
Macro, und nicht die Funktion verwenden.

von Stefan S. (Gast)


Lesenswert?

Na jedenfalls bin ich wohl nicht der Einzige der das nicht so recht 
versteht. Hier etwa rätseln sie auch:

http://stackoverflow.com/questions/9363899/why-mark-function-argument-as-volatile

DMA oder multihreading wäre sicher eine Möglichkeit.

Tatsächlich ist es so, dass ich Probleme bekomme, wenn ich einen VAR 
Parameter verwende, während es mit einem Pointer geht. Aber ich habe 
jetzt doch mal im Nim Forum nachgefragt. Vielleicht hat das Problem auch 
mit volatile gar nichts zu tun.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.