2011-08-09 14 views
14

Estoy creando un archivo c para una cola de distribución que obtiene una tarea y la coloca en una cola que es la lista vinculada. Con el fin de hacer esto, necesito crear hilos usandoC, cómo crear subprocesos usando la función pthread_create

pthread_t cThread; 
if(pthread_create(&cThread, NULL, work, param)){ 
    perror("ERROR creating thread."); 
} 

Sin embargo Necesito hacer otra función que entra en el 'trabajo' y la variable 'parámetro' como parámetros de crear la función. Mi amigo me dijo que solo tengo que poner cualquier código en la función de trabajo que se repita infinitamente para que el hilo no muera. ¿Alguien puede explicar cada parámetro va a la función pthread_create, especialmente para work y param? He buscado en Google para esto, pero la mayoría de los tutoriales son tan difíciles de entender el concepto ...

+0

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html – miku

+0

Sí, lo leí. Solo quiero que alguien me explique en oraciones, lo que cada parámetro es para – Leanne

Respuesta

23

Los cuatro parámetros a pthread_create son, en orden:

  1. Un puntero a una estructura pthread_t, que pthread_create completará con información sobre el hilo que crea.

  2. Puntero a un pthread_attr_t con parámetros para el hilo. Puede pasar con seguridad NULL la mayor parte del tiempo.

  3. Una función para ejecutar en el hilo. La función debe devolver void * y tomar un argumento void *, que puede usar como mejor le parezca. (Por ejemplo, si está iniciando varios subprocesos con la misma función, puede usar este parámetro para distinguirlos).

  4. El void * con el que desea iniciar el hilo. Pase NULL si no lo necesita. respuesta

16

clarificación de duskwuff:

work parámetro es un puntero de función. La función debe tomar un argumento que se indica como tipo void * y el valor de retorno void *.

param se espera que sea un puntero a los datos que work recibirá.

Como ejemplo, digamos que quiere pasar dos int al trabajador. A continuación, puede crear algo como esto:

int *param = (int *)malloc(2 * sizeof(int)); 
param[0] = 123; 
param[1] = 456; 
pthread_create(&cThread, NULL, work, param); 

entonces su función de trabajo puede convertir el tipo de puntero y agarrar los datos param:

void *work(void * parm) { 
    int *param = (int *)parm; 
    int first_val = param[0]; 
    .... 
} 

Usted puede hacer cosas más complejas, como la creación de una estructura con todos los datos que necesitas pasar

+6

Por favor, no arroje valores devueltos de 'malloc'. Su retorno es 'void *' y siempre se puede asignar a cualquier puntero de datos. Lo mismo vale para 'parm'. –

+0

@Jens mal hábito de C++: / –

Cuestiones relacionadas