2011-02-10 11 views
8

Estoy tratando de escribir un programa de subprocesos múltiples, el número de subprocesos basados ​​en la entrada de la línea de comandos, por lo que no puedo codificar los subprocesos preestablecidos. ¿Es esta una forma válida de hacerlo?Cómo generar n hilos?

int threads = 5; // (dynamic, not hard-coded) 
int i = 0; 
pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 
    pthread_t foobar; 
    thread[i] = foobar; // will this cause a conflict? 
} 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, (void *)&foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

aquí está mi resultado de las modificaciones se sugiere a continuación. Parece que funciona bien.

int threads = 5; 
int i; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
    // pthread_join(thread[i], NULL); // don't actually want this here :) 
} 

sleep(1);  // main() will probably finish before your threads do, 
free(thread); // so we'll sleep for illustrative purposes 
+2

no se puede simplemente asignar un entero a una cadena en el bit 'int threads = argv [3]'. Tienes que usar 'atoi' o sscanf –

+0

gracias, tienes razón. fijo. –

+0

Bueno, con 'pthread_join()' como está, deberás crear el hilo y esperar a que termine antes de generar el siguiente. Así que, de hecho, serás casi un único hilo aquí :) –

Respuesta

7

¿Qué hay en el primer ciclo? ¿Establece los elementos de la matriz en valor sin inicializar?

así que creo que eso es lo que necesita:

int threads = 5, i = 0, ret = -1; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

Desova hilos hilos, comenzando foobar_function en cada uno. Y tiene (si todo va bien :)) sus identificadores en fila matriz. Por ejemplo, puede cancelar el segundo hilo llamando al pthread_cancel(thread[1]), etc.

+0

@Brian D: la función para el hilo que especifica como un tercer parámetro para 'pthread_create()'. –

+0

Sí, creo que eso es lo que trato de hacer. En el ejemplo que estoy siguiendo, dado que es un número estático de pthreads, simplemente escriben 'pthread_t t1;' y 'pthread_t t2;' y luego los inicializan después con dos funciones diferentes, así que estoy tratando de descubrir cómo dinámicamente hacer n hilos. –

+0

@Brian D: Así que saltea esa parte (ya que la naturaleza de pthread_t es desconocida, no se puede establecer en ningún tipo de indefinido). Obtienes los ids de los hilos (y comienzas los hilos también) en el segundo ciclo. –

1

El primer bucle for no es válido C, y no estoy seguro de qué quiere que haga. Simplemente quítelo y el resto del código se ve bien, aparte del molde incorrecto en foobar_function. El molde debe ser:

(void *(*)(void *))foobar_function 

pero a menos que el tipo ya está presente, o algo muy cercano, su programa probablemente ha indefinido comportamiento. Sería mejor arreglar la firma de la función para que no se necesite moldear.

+0

sí, tienes razón, gracias. –

-2

Si está tratando de escribir un programa multiproceso, pero no entiende cómo asignar una estructura de datos de tamaño dinámico, puede estar haciendo las cosas incorrectamente.

Aprenda a caminar antes de correr.

Considere utilizar un lenguaje más sencillo y evite el uso de subprocesos (explícitos).

Los hilos son muy difíciles de usar correctamente; las matrices de tamaño dinámico son muy fáciles de lograr (incluso bastante fácil en C)

+0

Hay pocas opciones en el lenguaje o el uso de hilos explícitos cuando se trata de una tarea para casa :) –

Cuestiones relacionadas