Wie war das noch mit volatile in C ?

Gast #4307176
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.
Gast #4307193
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...
Gast #4307196
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.
Gast #4307330
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.
Gast #4307853
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren