Usar Glib::Dispatcher

Los «slots» conectados a objetos sigc::signal se ejecutan en el hilo que llama a emit() u operator()() en la señal. Glib::Dispatcher no se comporta de esa manera: en su lugar, sus «slots» conectados se ejecutan en el hilo en el que el objeto Glib::Dispatcher se construyó (que debe tener un bucle principal de glib). Si un objeto Glib::Dispatcher se construye en el hilo principal de la IGU (que por ende será el hilo receptor), cualquier hilo de trabajo puede emitir sobre él y sus «slot» conectados podrán ejecutar funciones de gtkmm con seguridad.

Aún así, algunas reglas de seguridad de hilos sobre el uso de Glib::Dispatcher se aplican. Como se mencionó, un objeto Glib::Dispatcher debe construirse en el hilo receptor (aquel en cuyo bucle principal ejecutará sus «slot» conectados). Por defecto este es el hilo principal del programa, a pesar de que hay un constructor Glib::Dispatcher que toma el objeto Glib::MainContext de cualquier hilo que tiene un bucle principal. Solo el hilo receptor debe llamar a connect() en el objeto Glib::Dispatcher, o manipular cualquier objeto sigc::connection relacionado, a menos que se emplee sincronización adicional. Sin embargo, cualquier hilo de trabajo puede emitir con seguridad en el objeto Glib::Dispatcher sin bloquear una vez que el hilo receptor ha conectado los «slot», siempre que se construya antes de que el hilo de trabajo arranque (si se construye después, normalmente se requerirá sincronización adicional para asegurar la visibilidad).

Dejando de lado el hecho de que los «slot» conectados siempre se ejecutan en el hilo receptor, los objetos Glib::Dispatcher son similares a los objetos sigc::signal<void;>. Por lo tanto, no pueden pasar argumentos sin vincular ni devolver un valor. La mejor manera de pasar esos argumentos es con una cola segura para hilos (asíncrona). Al momento de escritura, glibmm no tiene una, pero mucha gente escribiendo código de hilos múltiples tendrá una disponible (son relativamente fáciles de escribir a pesar de que son detalles de combinar seguridad de hilos con seguridad fuerte de excepciones).

Solo el hilo receptor o de trabajo pueden emitir in objeto Glib::Dispatcher, aunque que esto debe hacerse dentro de límites razonables. En sistemas similares a Unix, los objetos Glib::Dispatcher comparten un hilo común, que en teoría podría llenarse en un sistema muy cargado ejecutando un programa con un número muy alto de objetos Dispatcher en uso. Si la tubería se llenara antes de que el bucle principal del hilo tuviera la oportunidad de leerla para vaciarla, y el hilo receptor intentara emitir, es decir escribirle cuando está en esta condición, el hilo receptor se trabaría en la escritura, bloqueándose mutuamente. Cuando el hilo receptor está por emitir, un objeto sigc::signal<void> normal puede usarse en su lugar.