Ejemplo n.º 1
0
void escribirResultado(char * ovalue, int oflag, char * o_value, int o_flag, char * nombre_archivo, char * nHebras, char * nProcesos, vector <string> vector_palabras){
////////// ESCRITURA DEL ARCHIVO DE SALIDA ////////////////////////
  ofstream archivo_salida(nombre_archivo);
  string tipo_archivo;
    
  if(oflag == 1){
    tipo_archivo = mostrarTipo(ovalue);
    archivo_salida << tipo_archivo << endl;
  }
  if(o_flag == 1){
    int es_textplain = esTextoPlano(o_value);
    if (es_textplain == 1){
      escribirFichero(o_value,archivo_salida);
    }
  }

  archivo_salida << "nHebras = " << nHebras << "\n" << "nProcesos = " << nProcesos << endl;

  for(int i = 0; i < vector_palabras.size();i ++){
    archivo_salida << vector_palabras[i] << endl;
  }    
  archivo_salida.close();
}
Ejemplo n.º 2
0
Archivo: main.c Proyecto: Elitos/ls2
int main(int argc, char ** argv) {
  char *SnHebras; char *SnGrupos; char *File_name; char opcion;
  while((opcion = getopt(argc, argv,"g:h:i:"))!= -1){
    if(opcion == -1){
        printf("Entradas no validas\nFormato entrada: ./main -i entrada.dat -g 5 -h 4\n");
        abort();
    }
    switch (opcion){
      case 'g' : 
        SnGrupos = optarg;
        break;
      case 'h' : 
        SnHebras = optarg;
        break;
      case 'i' : 
        File_name = optarg;
        break;
      default : /*Errores*/
        printf("Entradas no validas\nFormato entrada: ./main -i entrada.dat -g 5 -h 4\n");
        abort();
    }
  }
  nGrupos = atoi(SnGrupos); nHebras = atoi(SnHebras); 
  if(nGrupos < 1 || nHebras < 1){
     printf("Entrada no valida, hebras y grupos\n como minimo valor debe ser 1\n");
     abort();
  }
  matriz = (int **)malloc(sizeof (int**));
  matriz[0]= (int *)malloc(sizeof (int*));
  FILE * archivo_entrada =  fopen(File_name,"r");
  int i; int j;
  int cX = 1; int cY = 1;
  char c = 'c';
  int numeroElemListas = 0;
  int elemento = 0; nListas = 1; int cl = 0;

  int nMinL;  int largoMinL;

  while(c != EOF){
    fscanf(archivo_entrada,"%d",&numeroElemListas);
    matriz[cX-1]= (int *)realloc(matriz[cX-1],(numeroElemListas)*sizeof(int*));
    for( i = 1 ; i <= numeroElemListas ; i++){         
      fscanf(archivo_entrada,"%d",&elemento);
      matriz[cX-1][i-1] = elemento;
      cY++;
    }
    cl++;
    if(cl == 1 || largoMinL > numeroElemListas){
      largoMinL = numeroElemListas;
      nMinL = cl;
    }
    c = fgetc(archivo_entrada);//*********matriz[cX-1]= (int *)realloc(matriz[cX-1], cY * sizeof(int*) );///matriz[cX-1][cY-1] = '\0';      
    if(c != EOF){
      nListas++; cX++;
      matriz = (int **)realloc(matriz,cX*sizeof(int**));
      matriz[cX-1]= (int *)malloc(sizeof(int));
      cY = 1;            
    }
  }
  fclose(archivo_entrada);


  // Matriz menor largo
  nMinL = nMinL-1;
  //printf("El largo de la menor lista es: %i y es la lista número %i.\n", largoMinL, nMinL +1);  
  int * s_incial = (int *)malloc(sizeof(int)); s_incial = matriz[nMinL];

  int faltan = nMinL+1;
  for(faltan ; faltan < nListas ; faltan++){
      matriz[faltan-1]= matriz[faltan]; 
  }
  matriz[nListas-1]= (int *)malloc(sizeof(int));
  free(matriz[nListas-1]);
  nListas--;

  // Grupo de listas S prima para caga grupo de hebras
  s_grupo = (int **)malloc(sizeof(int*)*nGrupos);
  for( i = 0 ; i < nGrupos ;i++){ 
    s_grupo[i]= (int*) malloc(largoMinL* sizeof(int)); s_grupo[i] = s_incial;
  }    

  // Para el total de hebras en competencia creo un s' nulo de tamaño igual al de menor lista
  int nHebras_total = nHebras * nGrupos; 
  tiempos_x_grupo = (double*)malloc(nGrupos*sizeof(double));
  arrhebras = (hebra*)malloc(nHebras_total* sizeof(hebra)); 
  s_prima = (int**)malloc(nGrupos*sizeof(int*));
  for( i = 0 ; i < nGrupos ; i++){
   s_prima[i] = (int*)malloc(largoMinL* sizeof(int)); s_prima[i][0]= '\0';
  }

  // Creo array de mutex paa accesso de cada hebra a su s comun por grupo
  arrMutex = (pthread_mutex_t*)malloc(nGrupos*sizeof(pthread_mutex_t));
  for(i = 0 ; i < nGrupos ; i++){
    pthread_mutex_init(&arrMutex[i],NULL);
  }
  // Relaciono hebras con grupos
  int ch = 0;
  for (i = 0; i < nGrupos; i++) {
    for( j = 0 ; j < nHebras ; j++){ arrhebras[ch].nGrupoG = i; arrhebras[ch].nHiloG = j; ch++; } 
  }
  
  // creo barreras coordinacion
  pthread_barrier_init(&barrera_inicial, NULL, nHebras_total); noSeEncuentran = (int *)malloc(largoMinL* sizeof(int)); noSeEncuentran[0] = '\0';
  arr_barrera_1_a_1 = (pthread_barrier_t *)malloc(nGrupos*(sizeof(pthread_barrier_t))); arr_barrera_1_a_M = (pthread_barrier_t *)malloc(nGrupos*(sizeof(pthread_barrier_t)));
  arr_barrera_1_a_sprima = (pthread_barrier_t *)malloc(nGrupos*(sizeof(pthread_barrier_t))); arr_barrera_1_s_grupo = (pthread_barrier_t *)malloc(nGrupos*(sizeof(pthread_barrier_t)));
  arr_barrera_1_a_gs = (pthread_barrier_t *)malloc(nGrupos*(sizeof(pthread_barrier_t)));

// Instacio barreras
  for( i = 0 ; i < nGrupos ; i++){
    pthread_barrier_init(&arr_barrera_1_a_1[i], NULL, nHebras); pthread_barrier_init(&arr_barrera_1_a_M[i], NULL, nHebras);
    pthread_barrier_init(&arr_barrera_1_a_sprima[i], NULL, nHebras); pthread_barrier_init(&arr_barrera_1_s_grupo[i], NULL, nHebras);
    pthread_barrier_init(&arr_barrera_1_a_gs[i], NULL, nHebras);
  }
  //Arranco hebras 
  for( i = 0 ; i < nHebras_total; i++){
    pthread_create(&arrhebras[i].thread_h, NULL, funcionHebras, (void*)i);
  }
  // Espero hebras
  for (i = 0 ; i < nHebras_total; i++) {
    pthread_join(arrhebras[i].thread_h, NULL); 
  }
  // Genero archivo
  archivo_salida(nGrupos,nHebras, nListas, s_grupo,nHebras_total,arrhebras);

}