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; }
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; }