De la página de manual de pthread_key_create FreeBSD: /comentario
... La función
pthread_key_create()crea una clave de datos específica del subproceso visible para todos los subprocesos en el proceso. Los valores clave proporcionados porpthread_key_create()son objetos opacos que se utilizan para ubicar datos específicos del subproceso. Aunque diferentes subprocesos pueden usar el mismo valor de clave, los valores vinculados a la clave porpthread_setspecific()se mantienen por subproceso y persisten durante la vida del subproceso que llama.
Supongo que las instancias de pthread_key_t producidas están vinculadas a un proceso (de ahí la palabra opaca en la página del manual), y que se vuelven inválidas después de un fork() . Sin embargo, no pude encontrar ninguna referencia en las páginas de manual existentes o en la documentación.
¿Alguien puede confirmar/comentar?
Supongo que las instancias pthread_key_t producidas están vinculadas a un proceso
Hay muchas razones para pensar que las instancias son específicas del proceso, en el sentido de que si, por ejemplo, registra la representación de una clave en la memoria compartida, entonces no tiene sentido para los procesos no relacionados que asignan el mismo segmento de memoria compartida.
(de ahí la palabra opaca en la página del manual),
Pero "opaco" no tiene nada que ver en particular con eso. Simplemente significa que no hay piezas reparables por el usuario en el interior. Estás destinado a usarlo solo como un todo.
y que estos se vuelven inválidos después de un fork().
Eso parece un poco de un salto. No esperaría eso en absoluto. fork() crea un duplicado casi exacto del proceso de llamada, sujeto a algunas excepciones enumeradas explícitamente, que se enumeran en el manual . Probablemente el más relevante es que el nuevo proceso contiene solo un hilo (el que llamó fork() ). La invalidación de las claves de datos específicos del subproceso no está en la lista, ni tampoco la pérdida de datos específicos del subproceso del subproceso inicial del hijo.
Sin embargo, no pude encontrar ninguna referencia en las páginas de manual existentes o en la documentación.
Exacto así.
SIN EMBARGO , los programas de subprocesos múltiples generalmente no deben bifurcarse, ya que existe un alto riesgo de que el proceso secundario quede en un estado no válido, como con mutexes que están bloqueados por subprocesos que no existen en el proceso secundario. Hay algunos casos especiales, como bifurcar a un niño que exec inmediatamente s, pero en la mayoría de los casos, no debe intentar mezclar subprocesos múltiples con multiprocesamiento.