]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - tests/gtkmm/threads/threads.cc
Se agrega un TODO.
[z.facultad/75.42/plaqui.git] / tests / gtkmm / threads / threads.cc
1 /*
2  * Ejemplo de threads con la glibmm.
3  *
4  * Para compilar:
5  * g++ -Wall `pkg-config --cflags --libs glibmm-2.0 gthread-2.0` -o threads threads.cc
6  *
7  * TODO: Poner las impresiones como secciones críticas.
8  *
9  */
10
11 #include <cstdlib>
12 #include <glibmm/thread.h>
13 #include <iostream>
14
15 void ejecuta_animal(const char* yo)
16 {
17         int cuento = 500 + rand()%500;
18
19         std::cout << yo << ": voy contar hasta " << cuento << std::endl;
20         // Yieldea para que primero imprima todas las "cabeceras".
21         Glib::Thread::yield();
22
23         for (int i = 0; i <= cuento; i++) {
24                 // Si es multiplo de 100, imprimo.
25                 if (!(i % 100)) {
26                         std::cout << "  " << yo << ": voy por " << i << " de "
27                                 << cuento << std::endl;
28                 }
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();
33         }
34 }
35
36 int main(int argc, char *argv[])
37 {
38         // Pone semilla para random.
39         srand(time(0));
40         // Inicializa "sistema de threads".
41         Glib::thread_init();
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),
48                                 "GNU"),
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),
56                                 "Vaca"),
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),
65                                 "Conejo"),
66                         true);
67         // Espera a que terminen todods.
68         thread1->join();
69         thread2->join();
70         thread3->join();
71         return 0;
72 }
73