2010-07-07 19 views
7

¿Alguien tiene un ejemplo simple de enhebrado en c?C threading en linux?

Quiero construir una pequeña aplicación de consola que leerá un archivo de archivo txt línea por línea y luego usará hilos para procesar todo el txt. ¿Cómo debería hacer esto? dividir el txt en X donde X = N de hilos, es lo primero que me viene a la mente, ¿hay una mejor manera?

+1

Cómo dividir y es necesario o no es muy, muy específico para su diseño. ¿Qué quiere decir con procesamiento, qué tipo de datos en el archivo ... no hay una solución para todos los casos. – pmod

+0

Cada línea es una url, el "procesamiento" visitará la url y analizará un poco de texto. – jahmax

Respuesta

7

Buscar pthreads. También soy un hilo novato. Aquí hay un fragmento de código para sumar de 1 a 1000000000 (también mi primer programa pthread que funciona).

#include <stdio.h> 
#include <pthread.h> 

struct arg { 
    int a, b; 
    int *rst; 
}; 
typedef struct arg arg; 

void* sum(void *); 

int main() 
{ 
    pthread_t sum1, sum2; 
    int s1, s2; 
    pthread_create(&sum1, NULL, sum, &(arg){1, 500000000, &s1}); 
    pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2}); 
    pthread_join(sum1, NULL); 
    pthread_join(sum2, NULL); 
    printf("%d\n", s1 + s2); 
} 

void* sum(void *ptr) 
{ 
    int i, temp = 0; 
    arg *x = ptr; 

    for(i = x->a; i <= x->b; ++i) 
     temp += i; 
    *(x->rst) = temp; 
} 
+1

'rst' debe declararse' volátil'. Además, este código solo es válido bajo el estándar C99, esto no es válido C89. –

+0

No es necesario. Nunca es modificado. –

+2

'rst' no necesita ser un puntero calificado' volátil', el código está bien. La tienda a '* (x-> rst)' no puede ser eliminada por el compilador, porque no puede determinar si es visible externamente; y el 'pthread_join' implica una barrera. – caf

8

La mejor opción en mi humilde opinión es utilizar los hilos POSIX. Puede ver más detalles HERE.

También verifique el enlace en la respuesta de James.

3

Si quieres una manera fácil de hacerlo, OpenMP es una poderosa biblioteca de subprocesos múltiple que es compatible con gcc.

#omp parallel for 
    for(i=0; i<1000; i++){ 
    a[i] = b[i] + c[i]; 
    } 

Esto realizará la simple adición de dos matrices y almacenar el resultado en "a", pero en una máquina de cuatro núcleos, se generan 4 hilos para manejarlo, (8 si se admite hyperthreading).

Programación fácil multinúcleo en Linux. :)

Una guía por un finlandés: http://bisqwit.iki.fi/story/howto/openmp/

1

división del txt en X donde X = N de hilos, es la primera cosa que viene a la mente , hay una manera mejor?

Depende de su aplicación.

  • Hilos puede ayudar si interpretar los datos es el cuello de botella, la ganancia de rendimiento estará limitado por el archivo de E/velocidad de O
  • Hilos no ayudará si la lectura del archivo es el cuello de botella, el disco I/O es limitado por el hardware y sólo se degradará si más hilos de solicitud de datos

Si la interpretación de la información toma tiempo se puede usar algo como el producer consumer pattern y probarse a sí mismo la cantidad de hilos que necesita. (Pruebe con un número bajo y vea cuántos le dan el mejor rendimiento). Algunos ejemplos se pueden encontrar here y here

Como las otras respuestas indican que puede usar pthreads para implementar el subproceso.

+0

Interpretar los datos es el cuello de botella, necesito visitar urls y hacerlo de a uno es lento y cojo. Ese enlace de wiki es muy bueno, gracias. ¿Tiene algunos ejemplos de "soluciones" de productor-consumidor en c? – jahmax

1

Lo primero es preguntarse si realmente necesita hacer varios subprocesos aquí. ¿Necesita estado compartido entre los hilos, p. ¿la información de análisis de todas las URL termina en la misma estructura de datos? Si no, los procesos (fork) pueden ser suficientes. O tal vez ni siquiera llegue tan lejos y solo use la programación basada en eventos (glib, libev).

Glib puede valer la pena, incluso si decide utilizar subprocesos después de todo, ya que tiene una abstracción decente de subprocesos, incluidos los grupos de subprocesos.Esto haría muy fácil la partición de su archivo, ya que solo crea pools de subprocesos X, luego agrega los pools de dl/parse a uno de ellos (línea-n.% De tamaño de grupo).

Si solo se trata de acelerar las descargas, tal vez su biblioteca http ya tenga funcionalidades relacionadas. Para curl, hay un montón de curl_multicalls, con un interesante example here.

+0

Por cierto, entre los ejemplos curl, también hay un [multiproceso] (http://www.google.com/codesearch/p?hl=en#R2f_w0jVjyE/pub/solaris-freeware/SOURCES/curl- 7.12.2.tar.gz% 7CfL00qoACRlM/curl-7.12.2/docs/examples/multithread.c & d = 7) que podría ser justo lo que necesita. – mhd