Sobre el Linux multiproceso

  

En primer lugar, crear
hilo

archivo de cabecera

# include < pthread.h >

declaración de la función

int pthread_create (pthread_t * hilo, const pthread_attr_t * attr, void * (* start_routine) (void *), void * arg);

crear un nuevo hilo llama a la función pthread_create en un hilo, el hilo actual ejecución continúa en pthread_create abajo, función de entrada start_routine para el hilo de nueva creación, la función start_routine recibe un parámetro se pasa a ella por arg parámetro pthread_create, el tipo del parámetro es * vacío, el puntero de qué tipo interpretado llamando por su propia definición, start_routine tipo de retorno es nulo, el puntero del mismo significado que el definido por el propio persona que llama, cuando el retorno start_routine, se retiró de este hilo, otros hilos pueden llamar pthread_join start_routine obtener el valor de retorno.

Descripción del parámetro

El primer parámetro es un puntero a un identificador de hilo.

El segundo parámetro se usa para establecer las propiedades de hilo para especificar varias propiedades de hilo.

El tercer parámetro es la dirección de inicio de la rosca de ejecutar la función, la función tiene un solo parámetro de puntero universal, Arg, si los parámetros necesarios transmiten a más de un start_rtn función, entonces estos parámetros en una configuración requerida, Luego pase la dirección de esta estructura como argumento a arg.

El último parámetro es el argumento de la función.

Valor de retorno

Devuelve 0 si el subproceso se creó correctamente. Si la creación del subproceso falla, se devuelve el número de error y el contenido de * subproceso no está definido.

primera rosca un simple procedimiento de

# include < stdio.h >

# include < pthread.h >

void printThread ( Const char * s)

{

pid_t pid;

pthread_t tid;

pid = getpid ();

tid = pthread_self ();

printf ("% s pid% u tid% u (0x% x) \\ n ", s, (unsigned int) pid, (unsigned int) tid, (unsigned int) tid );

}

void * plazo (void * arg)

{

printThread (" nuevo hilo: ");

NULL retorno;

}

int main (void)

{

pt pthread_t;

int err = pthread_create (&PT, NULL, correr, NULL);

Si (err = 0)

printf (" no se puede crear hilo:% s \\ n ", strerror (err ));

printThread (" hilo principal: ");

pthread_join (pt, NULL);

return 0;

}

Nota

Debido a la biblioteca pthread por defecto no es un sistema Linux, pero librería de hilos POSIX. Úselo como una biblioteca en Linux, así que agregue -lpthread (o -pthread) para vincular explícitamente la biblioteca.

$ g ++ main.cpp -lpthread -o principal

$. /principal

dos, la función pthread_join

declaración de la función

int pthread_join (pthread_t hilo, retval ** void);

parámetro

hilo: identificador de hilo, es decir, el ID del hilo, que identifica un hilo único.

retval: un puntero definido por el usuario que almacena el valor de retorno del subproceso en cola.

Descripción

La función pthread_join bloquea la ejecución del hilo actual para esperar a que finalice el hilo especificado por el hilo. Cuando la función vuelve, los recursos del hilo en espera se reclaman. Si el proceso ha finalizado, la función volverá inmediatamente. Y el subproceso especificado por subproceso debe poder unirse, el subproceso recién creado puede unirse de forma predeterminada.

En tercer lugar, los dos estados: hilos acoplables (por defecto) y separada

hilos acoplables pueden ser recuperados por otros hilos, otros hilos antes de ser reciclada, que ocupa recursos de memoria no son Liberado, y el subproceso separado no puede ser reclamado por otros subprocesos, y el sistema libera automáticamente los recursos de memoria que ocupa.

Por defecto, el hilo es acoplable sólo cuando pthread_join devuelve la función, se considerará la creación de hilos terminados, con el fin de liberar recursos del sistema se entretienen mientras que el hilo individual no está esperando que el otro hilo, el hilo es terminada Libere inmediatamente los recursos del sistema.

función pthread_attr_setdetachstate, el estado hilo declaración de la función se establece pthread_attr_setdetachstate (pthread_attr_t * attr, int detachstate); en el que el segundo parámetro es PTHREAD_CREATE_DETACHED opcional (hilos separados) y pthread _CREATE_JOINABLE (hilo no separados).

Si configura un hilo separado para enhebrar, y este hilo carreras y muy rápido, es probable que vuelva antes de la función pthread_create cesaría, es posible transferir los números y recursos del sistema de rosca a otros hilos después de su terminación Use, por lo que el hilo que llama a pthread_create obtiene el número de hilo incorrecto. Para evitar esta sincronización puede tomar ciertas medidas, una de la manera más fácil es llamar a una función se crea en hilo de pthread_cond_timewait, que este hilo que esperar por un tiempo, dejando suficiente tiempo para que el retorno de la función pthread_create. Establecer un tiempo de espera es un método común en la programación multiproceso. Pero tenga cuidado de no usar funciones como esperar, que es hacer que todo el proceso se duerma, y ​​no puede resolver el problema de la sincronización de subprocesos.

Si un hilo en un proceso llevado a cabo pthread_detach (th), estará en el XX hilo estado separado, lo que hace de hilo º para liberar la memoria ocupada por sus propios recursos al final de la carrera, pero no puede ser hecho pthread_join ( Sincronización, después de que se ejecuta pthread_detach (), solicitar pthread_join () en th devolverá un error.

IV multiproceso configuraciones de atributos Linux
valores de atributo predeterminados

pthread_attr_t attr

ATTR de;

propiedades de inicialización

pthread_attr_t attr;

pthread_attr_init (&attr);

pthread_attr_init finalización exitosa devolverá 0, devuelve cualquier otro valor indica un error y devuelve el valor correspondiente.

destrucción de la propiedad

Utilice pthread_attr_destroy (&attr) asignado durante la inicialización borrar el espacio de almacenamiento, objetos de propiedad dejarán de ser válidos, la función devuelve cero después de completar con éxito, cualquier otro valor de retorno indica que el error y devuelve el valor correspondiente.

Copyright © Conocimiento de Windows All Rights Reserved