2012-05-03 21 views
10

se tenga lo siguiente:¿Cómo funciona pthread_create()?

pthread_t thread; 
pthread_create(&thread, NULL, function, NULL); 
  • ¿Qué hace exactamente pthread_create hacer para thread?

  • ¿Qué pasa con thread después de que se haya unido al hilo principal y terminado?

  • ¿Qué pasa si, después de thread se ha unido, que haga lo siguiente:

    pthread_create(&thread, NULL, another_function, NULL); 
    
+4

Estoy siendo votado ... ¿por qué? Es una pregunta específica sobre programación. –

+1

+1, siempre es bueno saber sobre los detalles de implementación. –

+0

Lo bueno de la fuente abierta es que la fuente está abierta. Siempre puedes descargar el código fuente de pthread y verificarlo. – mfontanini

Respuesta

5

¿Qué exactamente pthread_create do a thread?

thread es un objeto, puede contener un valor para identificar un hilo. Si pthread_create tiene éxito, rellena un valor que identifica el subproceso recién creado. Si falla, entonces el valor de thread después de la llamada no está definido. (referencia: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_create.html)

¿Qué sucede con el hilo una vez que se ha unido al hilo principal y terminado?

Nada sucede al objeto, pero el valor que ya no se sostiene refiere a cualquier hilo (así por ejemplo, ya no se puede pasar a funciones que toman un pthread_t, y si accidentalmente hace entonces usted podría obtener ESRCH errores de vuelta).

¿Qué pasa si, después de hilo se ha unido, que hace esto:

mismo que antes: si pthread_create tiene éxito, se le asigna un valor que identifica el hilo de nueva creación.

2

pthread_create creará un hilo mediante llamadas del sistema operativo. Lo maravilloso de la abstracción es que realmente no necesitas preocuparte por lo que sucede a continuación. Establecerá el subproceso variable igual a un identificador que se puede utilizar para hacer referencia a ese subproceso. Por ejemplo, si tiene varios hilos y desea cancelar una de ellas acaba de llamar

pthread_cancel (rosca)

utilizando el identificador pthread_t derecho a especificar el hilo que le interesa.

¿Qué sucede con el hilo una vez que se ha unido al hilo principal y termina el ?

Antes de que termine el hilo, el hilo var sirve como clave/índice para obtener o identificar un hilo. Una vez que el hilo finaliza, el valor al que apuntaba la clave/índice ya no tiene que ser válido. Puede mantenerlo e intentar reutilizarlo, pero es casi seguro que cause errores.

¿Qué pasa si, después de hilo se ha unido, que hace esto:

pthread_create(&thread, NULL, another_function, NULL); 

No hay problema, ya que se le da una referencia para enhebrar el valor del hilo se ajustará a un identificador para el nuevo hilo que acaba de hacer. Sospecho que es posible que pueda ser el mismo que antes, pero no contaría con eso.

+1

¿Cómo se sabe que 'pthread_join' no modifica el objeto. El objeto es opaco No puede (y no debería) saber qué hace cada una de estas llamadas al objeto 'pthread_t' que pasa como parámetro. Todo lo que sabes es que se usa para identificar un hilo dentro de las otras llamadas 'pthread_ *'. –

+0

@Loki, 'pthread_join' toma su argumento' pthread_t' por valor; no puede afectar su valor. Ciertamente puede modificar el "objeto" que identifica el valor 'pthread_t', pero ese es un problema aparte, y uno que la respuesta de Paul nunca mencionó. Es la forma en que 'free' no modifica el puntero que se pasa. –

+1

@RobKennedy: Estás haciendo suposiciones. ¿Qué pasa si pthread_t fuera un puntero? Entonces puedes modificar el objeto fácilmente. Pero nos estamos perdiendo el punto. El punto es ** usted no sabe (y no debería saber) ** qué le hacen las funciones al objeto. El objeto es ** opaco ** por una razón. –

Cuestiones relacionadas