10.2.2. Definición de tareas

Un hilo cumple con una tarea, por lo que necesitas un manera de describir esa tarea. La clase Runnable proporciona unas interfaces comunes a ejecutar para cualquier tarea. Aquí está el núcleo de las clase Runnable de ZThread, que la encontrarás en el archivo Runnable.h dentro del directorio incluído, después de instalar la librería ZThread:

class Runnable {
public:
  virtual void run() = 0;
  virtual ~Runnable() {}
};

Al hacerla una clase base abstracta, Runnable es fácilmente combinable con una clase básica u otras clases.

Para definir una tarea, simplemente hereda de la clase Runnable y sobreescribe run( ) para que la tarea haga lo que quieres.

Por ejecomplo, la tarea LiftOff siguiente muestra la cuenta atrás antes de despegar:

//: C11:LiftOff.h
// Demonstration of the Runnable interface.
#ifndef LIFTOFF_H
#define LIFTOFF_H
#include <iostream>
#include "zthread/Runnable.h"

class LiftOff : public ZThread::Runnable {
  int countDown;
  int id;
public:
  LiftOff(int count, int ident = 0) :
    countDown(count), id(ident) {}
  ~LiftOff() {
    std::cout << id << " completed" << std::endl;
  }
  void run() {
    while(countDown--)
      std::cout << id << ":" << countDown << std::endl;
    std::cout << "Liftoff!" << std::endl;
  }
};
#endif // LIFTOFF_H ///:~

Listado 10.1. C11/LiftOff.h


El identificador id sirve como distinción entre multiples instancias de la tarea. Si sólo quieres hacer una instancia, debes utilizar el valor por defecto para identificarla. El destructor te permitirá ver que tarea está destruída correctamente.

En el siguiente ejemplo, las tareas de run( ) no están dirigidas por hilos separados; directamente es una simple llamada en main( ):

//: C11:NoThread.cpp
#include "LiftOff.h"

int main() {
  LiftOff launch(10);
  launch.run();
} ///:~

Listado 10.2. C11/NoThread.cpp


Cuando una clase deriva de Runnable, debe tene una función run( ), pero no tiene nada de especial - no produce ninguna habibilidad innata en el hilo.

Para llevar a cabo el funcionamiento de los hilos, debes utilizas la clase Thread.