2 * Ejemplo de threads con la glibmm.
5 * g++ -Wall `pkg-config --cflags --libs glibmm-2.0 gthread-2.0` -o threads threads.cc
7 * TODO: Poner las impresiones como secciones críticas.
12 #include <glibmm/thread.h>
15 void ejecuta_animal(const char* yo)
17 int cuento = 500 + rand()%500;
19 std::cout << yo << ": voy contar hasta " << cuento << std::endl;
20 // Yieldea para que primero imprima todas las "cabeceras".
21 Glib::Thread::yield();
23 for (int i = 0; i <= cuento; i++) {
24 // Si es multiplo de 100, imprimo.
26 std::cout << " " << yo << ": voy por " << i << " de "
27 << cuento << std::endl;
29 // Deja que se schedulee otro thread...
30 // XXX - La doc recomiendo no usar esta funcion, pero la pongo
31 // pa' probar nomas :)
32 Glib::Thread::yield();
36 int main(int argc, char *argv[])
38 // Pone semilla para random.
40 // Inicializa "sistema de threads".
42 // Crea un thread., por defecto no toma argumentos el thread, por lo
43 // que con SigC::bind() le "agrego" un argumento (de tipo const char*)
44 // adicional a la llamada.
45 Glib::Thread* thread1 = Glib::Thread::create(
46 SigC::bind<const char*>(
47 SigC::slot(&ejecuta_animal),
49 0, // Stack por defecto.
50 true, // Es 'joinable'.
51 true, // Se 'schedulea' a nivel de proceso (en linux siempre es asi)
52 Glib::THREAD_PRIORITY_LOW);
53 Glib::Thread* thread2 = Glib::Thread::create(
54 SigC::bind<const char*>(
55 SigC::slot(&ejecuta_animal),
57 0, // Stack por defecto.
58 true, // Es 'joinable'.
59 true, // Se 'schedulea' a nivel de proceso (en linux siempre es asi)
60 Glib::THREAD_PRIORITY_LOW);
61 // Se crea con todo por default (incluso la prioridad).
62 Glib::Thread* thread3 = Glib::Thread::create(
63 SigC::bind<const char*>(
64 SigC::slot(&ejecuta_animal),
67 // Espera a que terminen todods.