Homepage    Computer-Stoff(Titelseite)   Threads(Titelseite)

GDK/GTK und Threads


GDK-Threads enabled oder nicht?

Um GTK-Programme thread-safe zu machen, sollte man zuerst mal testen, ob die GDK-Libraries mit Thread-Unterstützung übersetzt worden sind. In jedem Fall sollte eines der beiden folgenden Makros definiert sein:

#ifndef G_THREADS_ENABLED
#error "error: g_threads not enabled..."
#endif

#ifdef G_THREADS_IMPL_NONE
#error "error: g_threads not implemented..."
#endif

GDK-Threads initialisieren

Bevor man Threads und GTK benutzen kann, muß man die GDK-Threads erst einmal initialisieren, und zwar mit der glib-Funktion

void g_thread_init (GThreadFunctions *vtable);

Welche Bedeutung das Argument hat, weiß ich nicht. Bei mir hat NULL funktioniert.


GTK-Programme thread-safe machen

Ein typisches GTK-Programm verharrt normalerweise in der gtk_main()-Schleife, wo es auf externe Events wartet. Verändert nun ein anderer Thread ohne Vorwarnung etwas an der Oberfläche, so kommt GTK durcheinander, was sich darin äußert, daß der Fokus der Widgets nicht mehr stimmt und diese erst sichtbar werden, wenn man darauf klickt.

Um diesen Effekt zu verhindern, muß man alle Zugriffe von Threads, in denen nicht das gtk_main() läuft, auf GTK-Funktionen durch einen in GDK definierten Mutex schützen:

gdk_threads_enter ();

/* hier können irgendwelche gtk_-Aufrufe gemacht werden. */

gdk_threads_leave ();

Versucht man dies allerdings mit dem Thread, in dem gtk_main() läuft, beispielsweise in callback-Funktionen, so blockiert das Programm. Umgekehrt kann man die GTK-main-Schleife (gtk_main_iteration()) nicht von einem Thread aus aufrufen. Dies ergibt lediglich eine Fehlermeldung auf stderr.

Leider muß man sagen, daß GTK trotzdem nicht 100prozentig thread-safe ist. Es gibt einige Funktionen, bei denen ich den Eindruck hatte, daß da irgendetwas nicht stimmt.


Homepage   Computer-Stoff(Titelseite)   Threads(Titelseite) by Michael Becker, 6/2001 Letzte Änderung: 12/2002.