Beispiel #1
0
std::set<int> *MultiThreadFactorAlgorithm::GetFactor(unsigned int number)
{
	std::set<int> *resultOutput = getFactorByZeroOrOne(number);
	if (resultOutput != nullptr)
		return resultOutput;
	unsigned int numberInput = number / 2;
	int *result = new int[numberInput];
	std::thread firstThread(subThreadAlgorithm, result, number, 0, numberInput / 2);
	std::thread secondThread(subThreadAlgorithm, result, number, numberInput / 2, numberInput);
	firstThread.join();
	secondThread.join();
	resultOutput = marshalResult(result, numberInput);
	delete[] result;
	return resultOutput;
}
Beispiel #2
0
int main(int argc, const char * argv[]) {
    //argc siempre va a ser 1 porque el nombre del programa se pasa como primer parámetro
    if ( argc != 3 )//Si no se pasan dos argumentos al programa, hay un error
    {
      fprintf( stderr, "Progam takes 2 parameters\n");
      exit(-1);
    }
    if ( atoi(argv[1]) < atoi(argv[2]) )//En la combinatoria, n debe ser mayor a k
    {
      fprintf( stderr, "n debe ser >= k\n");
      exit(-1);
    }
    struct thread_args args;//Declarar el struct que empaqueta los dos argumentos
    args.n =  atoi(argv[1]);
    args.k = atoi(argv[2]);
    firstThread();
    /*
    Después del primer thread se debe hacer un fork, ya que la función execlp que se debe ejecutar
    crea un proceso hijo que ejecuta un bash y termina al padre, por lo que si se hiciera execlp
    dentro de una pthread, se ejecutaría el comando pero terminaría el programa padre. Al hacer un fork
    hacemos que un proceso hijo ejecute el comando y cuando termina ese proceso hijo, no le va a pasar
    nada al padre (principal)
    */
    int pid;
    pid = fork();//iniciar fork desde esta linea
    if (pid < 0)//si pid < 0 hubo un problema con el fork
    {
      fprintf( stderr, "Fork Failed");
      exit(-1);
    }
    else if (pid == 0)//es el primer fork
    {
      execlp( "/bin/ps", "ps", "-U", "root", "-u" ,"root" ,"u", (char *) NULL);//ejecutar el comando
      /*Si se pone cualquier código en este espacio no se va a ejecutar porque execlp
      va a haber terminado el fork padre (pid = 0)
      */
    }
    else//Seguir ejecutando el proceso padre
    {
      wait( NULL );//Esperar a que termina el fork hijo
      printf("==================\n");
      secondThread(args);
      printf("La combinatoria de %d en %d es %d\n", args.n, args.k, combRes);//Imprimir el resultado obtenido por el segundo thread
      exit(0);
    }
    return 0;
}